Les systèmes distribués nous entourent partout aujourd'hui. Leur exemple le plus important est Internet hébergeant le World Wide Web. L'environnement informatique dans les systèmes informatiques d'entreprise est souvent distribué, interconnectant différents services des ressources humaines, services financiers aux systèmes de gestion d'actifs. De nombreuses applications sont même hébergées dans le cloud. Enfin, l'ingénierie à grande échelle et l'informatique scientifique aujourd'hui dépendent fortement des clusters afin de paralléliser leur charge de travail. Ces sujets sont discutés dans ma conférence informatique distribuée. Dans ce référentiel, vous pouvez trouver les exemples pratiques que j'utilise dans mon cours.
Prises
en c
en Java
HTML, CSS et JavaScript
Servlets java
Exemples déployables
Servlet proxy http
Pages Javaserver
Exemples déployables
JSPS autonomes
Java rmi
Xml
Exemples de documents XML et de normes connexes
Exemples de traitement XML avec Java
Services Web
RPC JSON
Interface de passage du message
Hadoop
Chacun des liens ci-dessus vous conduit à un sous-répertoire contenant un ensemble d'exemples. Chaque sous-répertoire a un propre fichier README.md avec des descriptions détaillées.
Puisque j'utilise également le même code dans mes diapositives, il existe des commentaires spéciaux tels que //(*@serverBox{2)}@*) pour la mise en forme dans mes codes ... vous pouvez les ignorer en toute sécurité ^ _ ^
Le concept de ce cours est que nous voulons comprendre comment fonctionnent le Web et les environnements d'application d'entreprise distribués. Nous voulons le faire en commençant à explorer comment communiquer sur un réseau au plus bas niveau d'abstraction (normalement) disponible pour les programmeurs, l'API Socket. À partir de là, nous progressons en haut des niveaux d'abstraction plus élevés, c'est-à-dire, c'est-à-dire des API plus simples et plus puissants sur les uns sur les autres (et finalement fondés dans des prises). De cette façon, nous aurons une solide compréhension de la façon dont les applications distribuées et le travail Web. Nous pourrons consulter un site Web et avoir immédiatement une compréhension approximative de son fonctionnement, jusqu'aux écrous et boulons. Pour chaque niveau d'abstraction que nous explorons, nous apprenons donc toujours des exemples de technologies.
Comme dit, nous commençons tout en bas: la communication dans les systèmes distribués aujourd'hui est généralement basée sur l'UDP ou le TCP. Les deux protocoles sont accessibles via l'API Socket, pour lesquels nous fournissons des exemples en C et Java. Dans le cadre de ces exemples, nous montrons également comment le texte peut être codé en Java et comment construire des serveurs qui peuvent traiter plusieurs demandes en parallèle. Les prises sont donc la base même des applications distribuées, le niveau le plus bas avec lequel un programmeur pourrait avoir à fonctionner.
Nous sommes désormais en mesure de comprendre les processus de communication de base en cours dans pratiquement n'importe quel réseau informatique actuel et Internet. Nous utiliserons cette compréhension pour étudier comment une organisation ou une entreprise peut se présenter au monde extérieur via un site Web. Nous voulons comprendre les technologies nécessaires pour construire un site Web qui peut interagir dynamiquement avec un utilisateur.
Le World Wide Web est basé sur trois piliers: HTTP, HTML / CSS / JavaScript et URL. HTTP, le protocole de transfert de texte Hyper, est un protocole de texte pour interroger les ressources qui est généralement transmis sur les connexions TCP. En fait, nous fournissons déjà des exemples d'implémentations du côté du serveur (serveur Web) et du client (navigateur Web) côté client de la communication HTTP à l'aide de sockets (et même un petit serveur Web parallèle. Nous fournissons ensuite des exemples rudimentaires pour HTML, CSS et JavaScript.
La mise en œuvre de HTTP basée sur des sockets est assez complexe. Les prises nous permettent d'accéder à TCP. Ce que nous aimerions avoir, c'est une API tout aussi élégante pour accéder à HTTP (le prochain niveau d'abstraction plus élevé). Une de ces technologies est Java Servlets. Les servlets sont utilisés pour implémenter le côté serveur d'une conversation HTTP. Un servlet est un sous-classe d'une classe Java spéciale qui met en œuvre des méthodes de gestionnaire pour différentes interactions HTTP ("méthodes HTTP"). Ces méthodes sont appelées par un conteneur servlet, l'implémentation réelle du serveur. Nous pouvons donc nous concentrer pleinement sur la logique d'application et n'avons pas à nous soucier de l'interaction du protocole lui-même. Nous fournissons une large gamme d'exemples pour les servlets Java, à la fois des exemples déployables ainsi qu'un servlet proxy HTTP autonome. Ainsi, avec Java Servlets, nous pouvons créer des composants de serveur qui peuvent interagir dynamiquement avec un client HTTP (comme un navigateur Web). Cela signifie que nous pouvons générer dynamiquement le contenu d'une page Web lorsqu'un navigateur les demande. Cependant, la construction de sites Web dynamiques complets en tant que servlets Java est à nouveau assez lourd, car les servlets sont des classes Java tandis que les pages Web sont HTML, que nous écrivions ensuite sous forme de constantes de chaîne à écrire à la sortie d'un servlet.
Les pages Javaserver (JSP) (JSP), qui nous permettent d'écrire des pages HTML (ou d'autres formats de texte) et d'inclure le code source Java. Les pages sont ensuite servies à nouveau par un conteneur de servlet. Chaque fois qu'une page est envoyée à un client, le code Java inclus est d'abord exécuté du côté du serveur (et peut générer une sortie supplémentaire). Après une inspection plus approfondie, nous pouvons constater que les JSP sont en fait des servlets "spéciaux": lorsqu'un JSP est accessible pour la première fois, le conteneur servlet crée dynamiquement le code source d'un servlet Java correspondant. Ce servlet est compilé, chargé, puis exécuté pour créer le contenu dynamique de la page à envoyer au client. Tout ce qui était "texte" dans JSP devient une chaîne à l'intérieur du servlet qui est écrit à la réponse HTTP du servlet. Tout ce qui était «code» dans le JSP est copié directement dans les méthodes du gestionnaire du servlet. Les JSP sont un moyen plus naturel de générer dynamiquement la sortie de texte (HTML) et de le servir à un client. À l'heure actuelle, nous avons une compréhension solide de la génération des contenus dynamiques du Web, de la façon dont un utilisateur peut interagir avec une application Web via des formulaires Web en utilisant son navigateur et comment nous pouvons réaliser des sessions.
Bien que ces technologies nous permettent de construire une vue dynamique "extérieure" d'une entreprise, la façon dont l'entreprise se présente sur le Web, nous explorons maintenant la vue "intérieure" de l'environnement informatique d'entreprise distribué. Ici, l'objectif est de construire un environnement dans lequel les applications de différents départements (département financier, ressources humaines, gestion d'actifs, ...) peuvent être liées les unes aux autres d'une manière extensible et à juste titre.
La première étape de cette route vers l'informatique d'entreprise est les appels de procédure distante (RPC), que nous explorons sur l'exemple de l'invocation de la méthode à distance Java (RMI). Nos exemples montrent comment un objet d'une application hébergée sur ordinateur est accessible à partir d'un autre programme exécuté sur un autre ordinateur. Cela nous rapproche déjà de réaliser des applications distribuées interconnectées sur un réseau. Cependant, Java RMI est toujours une technologie spécifique à Java et son protocole est binaire. Nous aimerions implémenter nos applications distribuées d'une manière indépendante de la plate-forme, en utilisant des protocoles très clairs, bien spécifiés et faciles à comprendre.
Notre poursuite d'une telle technologie nous oblige à prendre d'abord le décalage de l'apprentissage du langage de balisage extensible (XML. XML est un format d'auto-documentation pour stocker des structures de données complexes dans le texte. Il est similaire à HTML, mais sans aucun exemple de présentation sémantique ou de présentation.
Nous discutons ensuite des services Web. Les services Web sont le fondement de base de nombreux systèmes informatiques et architectures axés sur les services distribués. Ils sont invoqués à l'aide du protocole de savon basé sur XML généralement via HTTP. Leur interface et les fonctionnalités fournies sont décrites via le langage de description du service Web (WSDL), une autre norme XML. Sur la base de ce que nous savons déjà, nous pouvions désormais envoyer des données XML à un servlet Java via HTTP-POST, analyser ces données avec ces technologies de traitement XML Java, utiliser les mêmes technologies pour générer un document XML de sortie et renvoyer celui-ci comme réponse du servlet Java. En fait, nous pourrions même utiliser des pages Javaserver à cet effet. Cependant, il y a encore une manière plus simple: nous pouvons créer des services en tant qu'objets Java simples et les publier sur le serveur Apache Axis2 / Java. Le serveur les rendra accessibles via SOAP et générera automatiquement des descriptions WSDL. Ceux-ci peuvent ensuite être utilisés pour générer des objets proxy pour le côté client en utilisant, par exemple, maven. Nous étudions cette technologie sur plusieurs exemples.
JSON RPC est une autre approche d'appel de procédure distante (RPC) (spécifiée ici) où les structures de données échangées sont codées dans la notation d'objet JavaScript (JSON). Les données sont échangées via HTTP ou TCP. Les RCP JSON sont similaires aux services Web, mais conçus pour être plus pondérés. Nous discutons à nouveau de plusieurs exemples.
Comme dernier cas d'utilisation importante pour l'informatique distribuée, nous considérons la réalisation de calculs distribués à grande échelle. Ces calculs sont nécessaires dans de nombreux scénarios, allant des simulations en ingénierie à l'exploration de données et au traitement des entreprises.
Nous nous concentrons maintenant sur la façon dont la puissance de calcul des grappes massives peut être utilisée pour les calculs scientifiques et ingénieurs à grande échelle. Ces calculs ou simulations importants sont souvent divisés en plusieurs sous-problèmes plus petits. Ces problèmes plus petits sont ensuite résolus en coopération par plusieurs threads ou processus en parallèle. Cela implique souvent l'échange de messages à des intervalles de temps réguliers entre les processus travaillant sur des sous-problèmes étroitement liés. De toute évidence, les services Web, les servlets Java, ou même Java et le protocole HTTP, seraient les mauvaises technologies pour cela: pour les calculs à grande échelle, nous voulons devenir aussi efficaces que possible avec le moins de frais généraux que possible. Cela concerne particulièrement la communication, ce qui est très coûteux et le facteur limitant de l'accélération que nous pouvons atteindre avec la distribution. Nous voulons échanger efficacement les types de données primitifs et nous voulons utiliser des paradigmes de communication non pris en charge par HTTP / TCP, tels que les émissions, la multidiffusion et la communication asynchrone. Pour cela, une implémentation de l'interface de passage du message (MPI) serait la méthode de choix. Nous explorons cette technologie sur la base de plusieurs exemples dans le langage de programmation C.
Dans une dernière étape, nous discutons d'une technologie qui combine la capacité de créer des calculs distribués à grande échelle (du monde du MPI) avec le riche support d'outils de l'écosystème Java: MapReduce avec Apache Hadoop. MPI is the technology of choice if communication is expensive and the bottleneck of our application, frequent communication is required between processes solving related sub-problems, the available hardware is homogenous, processes need to be organized in groups or topological structures to make efficient use of collective communication to achieve high performance, the size of data that needs to be transmitted is smaller in comparison to runtime of computations, and when we do not need to worry much about exchanging data with a Environnement d'application distribué hétérogène. Hadoop, en revanche, couvre les cas d'utilisation où la communication n'est pas le goulot d'étranglement, car le calcul prend beaucoup plus de temps que la communication (pensez à l'apprentissage automatique), lorsque l'environnement est hétérogène, les processus n'ont pas besoin d'être organisés de manière particulière et que la division des tâches dans les sous-problèmes peut être effectuée efficacement en découpant les données de l'entructure, où des sous-problèmes, des sous-problèmes) et des textes de tampons), où les données ont été des données) et des textes de taille), et des sous-problèmes) et des caractéristiques de travail. Potentiellement énorme (perdre les avantages de la communication de style MPI), ou d'où vient les données et les résultats doivent être repoussés vers d'autres applications dans l'environnement, par exemple aux piles de servlet / service Web HTTP / Java. Nos exemples de Hadoop se concentrent sur le motif MapReduce (qui est un tout petit peu similaire à la diffusion / rassemblement / réduit en MPI, juste pour le scénario décrit ci-dessus).
Dans l'ensemble, ce cours vous permettra d'une compréhension approximative des technologies dominantes dans différents domaines de l'informatique distribuée, des sites Web dynamiques plutôt que des systèmes d'applications distribués internes de l'entreprise, à l'ingénierie distribuée et aux calculs scientifiques. Chaque champ est exploré avec des exemples pratiques et vous pouvez tester et jouer avec plusieurs exemples de technologies.
Pour chaque exemple, je liste explicitement le logiciel requis et je discute de la façon dont il peut être obtenu et installé. Ici, je donne un aperçu de ces composants logiciels.
La plupart des exemples que je fournis sont écrits dans le langage de programmation Java et peuvent s'exécuter sous des systèmes arbitraires, étant donné que Java est installé. Afin de les compiler, vous avez besoin d'un Java JDK installé. Mes exemples nécessitent Java 7 ou version ultérieure.
Sous Windows, vous devez télécharger et installer Java à partir du site Web Oracle.
Sous Linux, vous feriez sudo apt-get install openjdk-7-jdk (où vous pouvez remplacer 7 par n'importe quelle version ultérieure, comme 8 , si vous le souhaitez)
Plusieurs de mes exemples Java sont construits avec Maven. Tous ces exemples ont un fichier pom.xml dans leur dossier racine. Pour les construire, vous devez donc installer Maven.
Sous Windows, vous devez télécharger et installer Maven à partir du site Web d'Apache.
Sous Linux, vous feriez sudo apt-get install maven .
Si vous utilisez Eclipse (voir ci-dessous), vous n'avez pas besoin d'installer Maven car il est déjà intégré à Eclipse.
Je recommande Eclipse en tant qu'environnement développeur pour tous les exemples Java de ce référentiel. Chaque exemple Java est déjà livré avec un fichier Eclipse .project et avec Eclipse .settings . Eclipse intègre à la fois Maven et Git. Cela signifie que vous pouvez cloner ce référentiel à partir de l'éclipse et importer directement les projets JAVE pendant ce processus. Si vous cliquez avec le bouton droit sur les projets Maven et choisissez Maven -> Update Project... , Eclipse téléchargera et utilisera également toutes les bibliothèques et dépendances requises comme spécifié par le maven pom.xml pour vous.
Vous pouvez télécharger Eclipse à partir du site Web Eclipse. Je recommande d'utiliser au moins Eclipse Mars.1 pour son excellent support Maven et Git.
Pour exécuter certains des exemples de pages Java Servlets et Javaserver, vous devez télécharger le serveur Glassfish à partir du site Web de téléchargement correspondant. Je recommande d'utiliser au moins Glassfish 4.1.2.
Pour exécuter les exemples de service Web, vous devrez télécharger Apache Axis2 / Java à partir de la page de téléchargement correspondante. Je recommande d'utiliser au moins AXIS2 1.7.3.
Afin de compiler les exemples écrits dans le langage de programmation C (tels que les exemples de sockets basés sur C ), vous aurez besoin d'un compilateur C tel que GCC. Sous Linux, il doit normalement être déjà installé et peut autrement être installé via sudo apt-get install gcc . Sous Windows, vous devrez installer Mingw, généralement via le programme d'installation Web.
Plusieurs des exemples C sont disponibles pour Windows ou Linux. GCC vous permet de compiler les multiples-compiles, c'est-à-dire que si vous utilisez Linux, vous pouvez compiler les programmes C pour Windows. À cette fin, vous installerez d'abord sudo apt-get install gcc-mingw-w64-i686 , puis pouvez utiliser la commande gcc-mingw-w64-i686 de la même manière que vous utiliseriez gcc sous Mingw.
Afin de construire et de compiler nos exemples d'utilisation de l'interface de passage de messages (MPI), nous avons besoin d'une implémentation MPI. Nous choisissons mpich.
Sous Linux, vous pouvez installer les fichiers requis via sudo apt-get install mpich libmpich-dev .
ssh et rsync ) Afin de tester nos exemples Hadoop, nous devons maintenant configurer un cluster Hadoop à un nœud. Nous suivons donc le guide donné sur http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. Nous devons installer des pré-requis tels que ssh et rsync . Dans l'exemple Hadoop Readme, nous fournissons le guide d'installation pour Hadoop 2.7.2 Linux / Ubuntu. Il se résume au téléchargement et à l'installation de Hadoop à partir de l'un des miroirs fournis sur http://www.apache.org/dyn/closer.cgi/hadoop/common/, plus en suivant les directives du didacticiel lié.
Ce travail a des fins purement éducatives. Outre tout ce qui est mentionné ci-dessous, pour tout dans ce référentiel, j'impose une condition de licence supplémentaire: le code ne doit jamais être utilisé pour quoi que ce soit qui pourrait violer les lois de l'Allemagne, de la Chine ou des États-Unis. Cela vaut également pour tout autre fichier ou ressource fourni ici.
Les exemples de ce référentiel sont sous licence en vertu de la Licence publique générale GNU version 3, 29 juin 2007, avec les exceptions suivantes:
Tout dans les répertoires / javaserverpages / standalonejspswithjetty et / javaservlets / proxy est concédé sous licence Apache V2.0 et est partiellement dérivé du projet embedded-jetty-jsp avec le copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
Certains des exemples de Hadoop s'inspirent du modèle Maven-Hadoop-Java-WordCount par H3ML3T, pour lequel aucune information de licence n'est fournie. Les exemples sont entièrement différemment de plusieurs manières, par exemple dans la façon dont nous construisons des pots de graisse. Quoi qu'il en soit, ce projet original est bien décrit dans cette entrée de blog.
De plus, le mot notre Hadoop est basé sur l'exemple de comptage des mots bien connu pour la carte de la carte de Hadoop. Il est basé sur la version par Luca Menichetti [email protected] sous la version 2 de la licence publique générale GNU.