Los sistemas distribuidos nos rodean en todas partes hoy. Su ejemplo más destacado es Internet que aloja la World Wide Web. El entorno informático en los sistemas de computación empresarial a menudo también se distribuye, interconectando diferentes servicios de recursos humanos, departamentos financieros y sistemas de gestión de activos. Muchas aplicaciones incluso están alojadas en la nube. Finalmente, la ingeniería a gran escala y la computación científica hoy dependen en gran medida de los grupos para paralelizar su carga de trabajo. Estos temas se discuten en mi conferencia informática distribuida. En este repositorio, puede encontrar los ejemplos prácticos que uso en mi curso.
Bocadillos
Cª
en Java
HTML, CSS y JavaScript
Servlets de Java
ejemplos desplegables
Servlet proxy http
Páginas de Javaserver
ejemplos desplegables
JSPS independientes
Java RMI
Xml
Ejemplos para documentos XML y estándares relacionados
Ejemplos para el procesamiento XML con Java
Servicios web
JSON RPC
Interfaz de pase de mensajes
Hadoop
Cada uno de los enlaces anteriores lo lleva a un subdirectorio que contiene un conjunto de ejemplos. Cada subdirectorio tiene un archivo README.md con descripciones detalladas.
Como también uso el mismo código en mis diapositivas, hay algunos comentarios especiales como //(*@serverBox{2)}@*) para formatear en mis códigos ... puede ignorarlos de manera segura ^_ ^ ^
El concepto de este curso es que queremos comprender cómo funcionan los entornos de aplicación empresarial web y distribuida. Queremos hacerlo comenzando a explorar cómo comunicarse a través de una red en el nivel más bajo de abstracción (normalmente) disponible para los programadores, la API de socket. A partir de ahí, avanzamos los niveles de abstracción más altos paso a paso, es decir, la apilamiento de API más simple y más potente uno encima del otro (y finalmente basado en enchufes). De esta manera, obtendremos una comprensión sólida cómo las aplicaciones distribuidas y el funcionamiento web. Podremos mirar un sitio web e inmediatamente tener una comprensión aproximada de cómo puede funcionar, hasta las nueces y los pernos. Para cada nivel de abstracción que exploramos, por lo tanto, siempre aprendemos tecnologías de ejemplo.
Como se dice, comenzamos en la parte inferior: la comunicación en los sistemas distribuidos hoy generalmente se basa en UDP o TCP. Se accede a ambos protocolos a través de la API de socket, para lo cual proporcionamos ejemplos en C y Java. Como parte de estos ejemplos, también mostramos cómo se puede codificar el texto en Java y cómo construir servidores que puedan procesar múltiples solicitudes en paralelo. Los enchufes son, por lo tanto, la base de aplicaciones distribuidas, el nivel más bajo con el que un programador podría tener que trabajar.
Ahora podemos comprender los procesos básicos de comunicación que se realizan en prácticamente cualquier red informática actual e Internet. Utilizaremos esta comprensión para investigar cómo una organización o empresa puede presentarse en el mundo exterior a través de un sitio web. Queremos comprender las tecnologías necesarias para construir un sitio web que pueda interactuar dinámicamente con un usuario.
La World Wide Web se basa en tres pilares: HTTP, HTML/CSS/JavaScript y URLS. HTTP, el Protocolo de transferencia de Hyper Text, es un protocolo basado en texto para consultar recursos que generalmente se transmite a través de las conexiones TCP. En realidad, ya proporcionamos implementaciones de ejemplo tanto del lado del cliente del servidor (servidor web) como del cliente (navegador web) de la comunicación HTTP utilizando sockets (e incluso un pequeño servidor web paralelo. Luego proporcionamos algunos ejemplos rudimentarios para HTML, CSS y JavaScript.
La implementación de HTTP basado en enchufes es bastante complejo. Los enchufes nos permiten acceder a TCP. Lo que nos gustaría tener es una API igualmente elegante para acceder a HTTP (el siguiente nivel más alto de abstracción). Una de esas tecnologías son Java Servlets. Los servlets se utilizan para implementar el lado del servidor de una conversación HTTP. Un servlet es una subclase de una clase Java especial que implementa métodos de controlador para diferentes interacciones HTTP ("Métodos HTTP"). Estos métodos son llamados por un contenedor de servlet, la implementación real del servidor. Por lo tanto, podemos concentrarnos completamente en la lógica de la aplicación y no necesitamos preocuparnos por la interacción del protocolo en sí. Proporcionamos una amplia gama de ejemplos para los servlets de Java, ambos ejemplos desplegables, así como un servlet de proxy HTTP independiente. Entonces, con Java Servlets, podemos crear componentes del servidor que puedan interactuar dinámicamente con un cliente HTTP (como un navegador web). Esto significa que podemos generar dinámicamente el contenido de una página web cuando un navegador los solicita. Sin embargo, construir sitios web dinámicos completos como Servlets Java nuevamente es bastante engorroso, ya que los servlets son clases de Java, mientras que las páginas web son HTML, que luego escribiríamos en forma de constantes de cadena para escribir en la salida de un Servlete.
El siguiente nivel más alto de abstracción son las páginas de Javaserver (JSPS), que nos permiten escribir páginas HTML (u otros formatos de texto) e incluyen el código fuente de Java en ella. Las páginas son servidas nuevamente por un contenedor de servlet. Cada vez que se envía una página a un cliente, el código Java incluido se ejecuta primero en el lado del servidor (y puede generar salida adicional). Tras una inspección más cercana, podemos encontrar que los JSP son en realidad servlets "especiales": cuando se accede a un JSP por primera vez, el contenedor de servlet crea dinámicamente el código fuente de un servlet Java correspondiente. Este servlet se compila, se carga y luego se ejecuta para crear el contenido dinámico de la página que se enviará al cliente. Todo lo que era "texto" en JSP se convierte en una cadena dentro del servlet que está escrito a la respuesta HTTP del servlet. Todo lo que era "código" en el JSP se copia directamente en los métodos del controlador del servlet. Los JSP son una forma más natural de generar dinámicamente la salida de texto (HTML) y servirla a un cliente. En este momento, tenemos una comprensión sólida de cómo se pueden generar contenidos dinámicos en la web, cómo un usuario puede interactuar con una aplicación web a través de formularios web mediante el uso de su navegador y cómo podemos realizar sesiones.
Si bien estas tecnologías nos permiten construir una vista dinámica "externa" de una empresa, la forma en que la compañía se presenta en la web, ahora exploramos la vista "interna" del entorno de computación empresarial distribuido. Aquí, el objetivo es construir un entorno en el que las aplicaciones de diferentes departamentos (departamento financiero, recursos humanos, gestión de activos, ...) puedan conectarse entre sí de una manera extensible y segura futura.
El primer paso en este camino a la computación empresarial son las llamadas de procedimientos remotos (RPC), que exploramos sobre el ejemplo de Java Remote Method Invocat (RMI). Nuestros ejemplos muestran cómo se puede acceder a un objeto de una aplicación alojada en la computadora desde otro programa que se ejecuta en otra computadora. Esto ya nos acerca a las aplicaciones distribuidas interconectadas en una red. Sin embargo, Java RMI sigue siendo una tecnología específica de Java y su protocolo es binario. Nos gustaría implementar nuestras aplicaciones distribuidas de manera independiente de la plataforma, utilizando protocolos muy claros, bien especificados y fáciles de entender.
Nuestra búsqueda de dicha tecnología nos obliga a tomar primero la entrega del aprendizaje sobre el lenguaje de marcado extensible (XML. XML es un formato de autodocumento para almacenar estructuras de datos complejas en el texto. Es similar a HTML, pero sin ningún semántico o presentación predefinidas.
Luego discutimos los servicios web. Los servicios web son la base básica de muchos sistemas de computación empresarial distribuidos y arquitecturas orientadas a servicios. Se invocan utilizando el protocolo SOAP basado en XML generalmente sobre HTTP. Su interfaz y funcionalidad proporcionada se describe a través del lenguaje de descripción del servicio web (WSDL), otro estándar XML. Según lo que ya sabemos, ahora podríamos enviar datos XML a un servlet Java a través de HTTP-Post, analizar estos datos con estas tecnologías de procesamiento Java XML, usar las mismas tecnologías para generar un documento XML de salida y enviar este de vuelta como respuesta del Servlet Java. En realidad, incluso podríamos usar páginas de Javaserver para este propósito. Sin embargo, nuevamente hay una manera más simple: podemos crear servicios como simples objetos Java y publicarlos en el servidor Apache Axis2/Java. El servidor los hará accesibles a través de SOAP y generará automáticamente descripciones de WSDL. Estos se pueden usar para generar objetos proxy para el lado del cliente usando, por ejemplo, maven. Investigamos esta tecnología en varios ejemplos.
JSON RPC es otro enfoque de llamada de procedimiento remoto (RPC) (especificado aquí) donde las estructuras de datos intercambiadas están codificadas en la notación del objeto JavaScript (JSON). Los datos se intercambian a través de HTTP o TCP. Los RCP JSON son similares a los servicios web, pero diseñados para ser más ligeros. Nuevamente discutimos varios ejemplos.
Como último caso de uso importante para la computación distribuida, consideramos cómo se pueden realizar los cálculos distribuidos a gran escala. Tales cálculos son necesarios en muchos escenarios, desde simulaciones en ingeniería hasta minería y procesamiento de datos en empresas.
Ahora nos centramos en cómo se puede utilizar la potencia informática de los grupos masivos para los cálculos científicos y de ingeniería a gran escala. Tales cálculos o simulaciones grandes a menudo se dividen en varios subproblemas más pequeños. Estos problemas más pequeños se resuelven cooperativamente mediante múltiples hilos o procesos en paralelo. Esto a menudo implica el intercambio de mensajes a intervalos de tiempo regulares entre procesos que trabajan en subproblemas estrechamente relacionados. Obviamente, los servicios web, los servlets de Java, o incluso solo Java y el protocolo HTTP, serían las tecnologías incorrectas para eso: para los cálculos a gran escala, queremos ser lo más eficientes posible con la menor cantidad de sobrecarga posible. Esto se refiere especialmente a la comunicación, que es muy costoso y el factor limitante para la aceleración que podemos lograr con la distribución. Queremos intercambiar tipos de datos primitivos de manera eficiente y queremos utilizar paradigmas de comunicación no compatibles con HTTP/TCP, como transmisiones, multidifusión y comunicación asincrónica. Para esto, una implementación de la interfaz de aprobación de mensajes (MPI) sería el método de elección. Exploramos esta tecnología en función de varios ejemplos en el lenguaje de programación C.
En un paso final, discutimos una tecnología que combina la capacidad de crear cálculos distribuidos a gran escala (del mundo MPI) con el rico soporte de herramientas del ecosistema Java: MapReduce con Apache Hadoop. MPI es la tecnología de elección Si la comunicación es costosa y el cuello de botella de nuestra aplicación, se requiere una comunicación frecuente entre los procesos que resuelven los subproblemas relacionados, el hardware disponible es homogéneo, los procesos deben organizarse en grupos o estructuras topológicas para hacer un uso eficiente de la comunicación colectiva para lograr un alto rendimiento, el tamaño de los datos que deben transmitirse es menor en comparación con el tiempo de ejecución de los cálculos, y cuando no necesitamos tener que ver con el tamaño de los datos que se transmiten con un tiempo de transmisión con el tiempo que se está transmitiendo con el tiempo que se está transmitiendo con el tiempo que se está transmitiendo con el tiempo que se está transmitiendo con el tiempo que se debe a los datos que se deben transmitir con el tiempo que se está transmitiendo con el tiempo que se puede preocupar por un tiempo de preocupación por el tiempo que se puede transmitir. Entorno de aplicación distribuida heterogénea. Hadoop, por otro lado, cubre los casos de uso en los que la comunicación no es el cuello de botella, porque el cálculo lleva mucho más tiempo que la comunicación (piense en el aprendizaje automático), cuando el entorno es heterogéneo, los procesos no necesitan organizarse de manera especial y la división de tareas en subproblemas se puede hacer eficientemente al cortar los datos de la entrada en piezas iguales, donde los subproblemas son los datos de los trabajos de los batch, donde los datos se pueden cortar, eje, y los datos de la entrada, y los datos de la entrada, y los datos de la entrada, y los datos de la entrada, y los datos, los datos, los datos, los datos, los datos, y los datos, los datos, y los datos, los que tienen, los datos iguales. Potencialmente enorme (comer las ventajas de la comunicación al estilo MPI), o de dónde provienen los datos y los resultados deben retroceder a otras aplicaciones en el entorno, digamos a las pilas de servicios web HTTP/Java/Servlet web. Nuestros ejemplos de Hadoop se centran en el patrón MapReduce (que es un poco similar a la dispersión/recolección/reduce en MPI, solo para el escenario descrito anteriormente).
En general, este curso le dará una comprensión aproximada de las tecnologías dominantes en diferentes campos de la informática distribuida, desde sitios web dinámicos sobre sistemas de aplicaciones distribuidas internos de la compañía, hasta ingeniería distribuida y cálculos científicos. Cada campo se explora con ejemplos prácticos y puedes probar y jugar con varias tecnologías de ejemplo.
Para cada ejemplo, enumero explícitamente el software requerido y discuto cómo se puede obtener e instalar. Aquí doy una visión general sobre estos componentes de software.
La mayoría de los ejemplos que proporciono están escritos en el lenguaje de programación Java y pueden ejecutarse bajo sistemas arbitrarios, dado que Java está instalado. Para compilarlos, necesita un Java JDK instalado. Mis ejemplos requieren Java 7 o posterior.
En Windows, debe descargar e instalar Java desde el sitio web de Oracle.
En Linux, haría sudo apt-get install openjdk-7-jdk (donde puede reemplazar 7 con cualquier versión posterior, como 8 , si lo desea)
Varios de mis ejemplos de Java están construidos con Maven. Todos estos ejemplos tienen un archivo pom.xml en su carpeta raíz. Para construirlos, debe instalar Maven.
En Windows, debe descargar e instalar Maven desde el sitio web de Apache.
Bajo Linux, haría sudo apt-get install maven .
Si está utilizando Eclipse (ver más abajo), no necesita instalar Maven, ya que ya está integrado en Eclipse.
Recomiendo Eclipse como entorno de desarrollador para todos los ejemplos de Java en este repositorio. Cada ejemplo de Java en realidad ya viene con un archivo Eclipse .project y con Eclipse .settings . Eclipse integra tanto Maven como GIT. Esto significa que puede clonar este repositorio desde el eclipse e importar directamente los proyectos Jave durante este proceso. Si luego haga clic con el botón derecho en los proyectos Maven y elige Maven -> Update Project... , Eclipse también descargará y usará todas las bibliotecas y dependencias requeridas según lo especificado por el Maven pom.xml para usted.
Puede descargar Eclipse desde el sitio web de Eclipse. Recomiendo usar al menos Eclipse Mars.1 para su excelente soporte de Maven y Git.
Para ejecutar algunos de los ejemplos de páginas Java Servlets y Javaserver, debe descargar el servidor Glassfish desde el sitio web de descarga correspondiente. Recomiendo usar al menos el pez vidrio 4.1.2.
Para ejecutar los ejemplos de servicio web, deberá descargar Apache Axis2/Java desde la página de descarga correspondiente. Recomiendo usar al menos Axis2 1.7.3.
Para compilar los ejemplos escritos en el lenguaje de programación C (como los ejemplos de sockets basados en C ), necesitará un compilador C como GCC. En Linux, normalmente ya debe estar instalado y de lo contrario se puede instalar a través de sudo apt-get install gcc . En Windows, deberá instalar MingW, generalmente a través del instalador web.
Varios de los ejemplos C vienen para Windows o Linux. GCC le permite compilar cruzados, es decir, si está utilizando Linux, puede compilar programas C para Windows. Para este propósito, primero instalaría sudo apt-get install gcc-mingw-w64-i686 y luego puede usar el comando gcc-mingw-w64-i686 de la misma manera que usaría gcc en Mingw.
Para construir y compilar nuestros ejemplos para usar la interfaz de aprobación de mensajes (MPI), necesitamos una implementación de MPI. Elegimos mpich.
En Linux, puede instalar los archivos requeridos a través de sudo apt-get install mpich libmpich-dev .
ssh y rsync ) Para probar nuestros ejemplos de Hadoop, ahora necesitamos configurar un clúster Hadoop de un solo nodo. Por lo tanto, seguimos la guía dada en http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. Necesitamos instalar requisitos previos como ssh y rsync . En el ejemplo de ejemplo de Hadoop, proporcionamos la guía de instalación para Hadoop 2.7.2 Linux / Ubuntu. Se reduce a descargar e instalar Hadoop de uno de los espejos proporcionados en http://www.apache.org/dyn/closer.cgi/hadoop/common/, además de seguir las pautas del tutorial vinculado.
Este trabajo tiene propósitos puramente educativos. Además de todo lo mencionado a continuación, para cualquier cosa en este repositorio, impongo una condición de licencia adicional: el código nunca debe usarse para nada que pueda violar las leyes de Alemania, China o los Estados Unidos. Esto también se cumple para cualquier otro archivo o recurso proporcionado aquí.
Los ejemplos en este repositorio tienen licencia bajo la GNU General Public License versión 3, 29 de junio de 2007, con las siguientes excepciones:
Todo en los directorios /javaserverpages /standalonejspswithjetty y /javaservlets /proxy tiene licencia bajo la licencia Apache v2.0 y se derivan parcialmente del proyecto incrustado-jsty-jsp con copyright (c) 1995-2013 mort bay consulting pty. Ltd..
Algunos de los ejemplos de Hadoop se inspiran en la plantilla Maven-Hadoop-Java-WordCount por H3ML3T, para la cual no se proporciona información de licencia. Los ejemplos son de manera completamente diferente en varias maneras, por ejemplo, en la forma en que construimos frascos de grasa. De todos modos, este proyecto original se describe bien en esta entrada de blog.
Además, la palabra nuestra Hadoop se basa en el conocido ejemplo de conteo de palabras para la funcionalidad del mapa de Hadoop. Se basa en la versión de Luca Menichetti [email protected] bajo la GNU General Public License versión 2.