Verteilte Systeme umgeben uns heute überall. Ihr bekanntes Beispiel ist das Internet, das das World Wide Web veranstaltet. Die Computerumgebung in Enterprise Computing -Systemen wird häufig ebenfalls verteilt, wobei verschiedene Dienste von Personalressourcen, Finanzabteilungen, mit Vermögensverwaltungssystemen verbunden sind. Viele Anwendungen werden sogar in der Cloud gehostet. Schließlich beruht das große Ingenieur- und wissenschaftliche Computer heute stark auf Cluster, um ihre Arbeitsbelastung zu parallelisieren. Diese Themen werden in meinem verteilten Computervortrag diskutiert. In diesem Repository finden Sie die praktischen Beispiele, die ich in meinem Kurs verwende.
Steckdosen
in c
in Java
HTML, CSS und JavaScript
Java Servlets
Bereitstellbare Beispiele
HTTP Proxy Servlet
Javaserverseiten
Bereitstellbare Beispiele
eigenständiger JSPS
Java RMI
Xml
Beispiele für XML -Dokumente und verwandte Standards
Beispiele für die XML -Verarbeitung mit Java
Webdienste
JSON RPC
Schnittstelle zur Nachrichtenübergabe
Hadoop
Jedes der oben genannten Links führt Sie zu einem Unter-Verzeichnis, das eine Reihe von Beispielen enthält. Jedes Unterverzeichnis verfügt über eine eigene README.md Datei mit detaillierten Beschreibungen.
Da ich auch den gleichen Code in meinen Folien verwende, gibt es einige spezielle Kommentare wie //(*@serverBox{2)}@*) zum Formatieren in meinen Codes ... Sie können sie sicher ignorieren ^_ ^
Das Konzept dieses Kurses ist, dass wir verstehen möchten, wie das Web und die verteilten Unternehmensanwendungsumgebungen funktionieren. Wir möchten dies tun, indem wir beginnen, zu untersuchen, wie Sie über ein Netzwerk auf der niedrigsten Abstraktionsebene (normalerweise) über ein Netzwerk kommunizieren können, die den Programmierern, der Socket -API, zur Verfügung steht. Von dort aus arbeiten wir uns Schritt für Schritt höhere Abstraktionsniveaus, dh einfacher und leistungsstärkeres API-Stapel aufeinander (und letztendlich auf Sockets). Auf diese Weise erlangen wir ein solides Verständnis, wie verteilte Anwendungen und die Web funktionieren. Wir können uns eine Website ansehen und sofort ein hartes Verständnis dafür haben, wie sie bis hin zu den Muttern und Schrauben funktionieren kann. Für jede von uns erforschende Abstraktionsebene lernen wir daher immer Beispieltechnologien.
Wie gesagt, wir beginnen ganz unten: Die Kommunikation in verteilten Systemen heute basiert normalerweise entweder auf UDP oder TCP. Beide Protokolle werden über die Socket -API zugegriffen, für die wir Beispiele sowohl in C als auch in Java angeben. Als Teil dieser Beispiele zeigen wir auch, wie Text in Java codiert werden kann und wie Server konstruiert werden können, die mehrere Anforderungen parallel bearbeiten können. Sockeln sind somit die Grundlage für verteilte Anwendungen, die niedrigste Ebene, mit der ein Programmierer möglicherweise arbeiten muss.
Wir sind jetzt in der Lage, die grundlegenden Kommunikationsprozesse in praktisch jedem aktuellen Computernetzwerk und im Internet zu verstehen. Wir werden dies verstehen, um zu untersuchen, wie sich eine Organisation oder ein Unternehmen über eine Website der Außenwelt präsentieren kann. Wir möchten die Technologien verstehen, die erforderlich sind, um eine Website zu erstellen, die dynamisch mit einem Benutzer interagieren kann.
Das World Wide Web basiert auf drei Säulen: HTTP, HTML/CSS/JavaScript und URLs. HTTP, das Hypertextransferprotokoll, ist ein textbasiertes Protokoll, das Ressourcen abfragt, das normalerweise über TCP-Verbindungen übertragen wird. Tatsächlich bieten wir bereits Beispielimplementierungen sowohl des Servers (Webservers) als auch des Client -Client -Client -Client -Seite der HTTP -Kommunikation mithilfe von Sockets (und sogar einem kleinen parallelen Webserver. Wir geben dann einige rudimentäre Beispiele für HTML, CSS und JavaScript an.
Die Implementierung von HTTP auf Basis von Steckdosen ist ziemlich komplex. Mit Sockets können wir auf TCP zugreifen. Was wir gerne hätten, ist eine ähnlich elegante API, um auf HTTP zuzugreifen (die nächste höhere Abstraktionsebene). Eine solche Technologie sind Java -Servlets. Servlets werden verwendet, um die serverseitige Seite einer HTTP-Konversation zu implementieren. Ein Servlet ist eine Unterklasse einer speziellen Java-Klasse, die Handler-Methoden für verschiedene HTTP-Interaktionen ("HTTP-Methoden") implementiert. Diese Methoden werden von einem Servlet -Container aufgerufen, der tatsächlichen Implementierung des Servers. Wir können uns daher vollständig auf die Anwendungslogik konzentrieren und müssen uns keine Sorgen um die Protokollinteraktion selbst machen. Wir bieten eine breite Palette von Beispielen für Java-Servlets, beide einsatzbare Beispiele sowie ein eigenständiges HTTP-Proxy-Servlet. Mit Java -Servlets können wir Serverkomponenten erstellen, die dynamisch mit einem HTTP -Client (z. B. einem Webbrowser) interagieren können. Dies bedeutet, dass wir dynamisch Inhalte einer Webseite generieren können, wenn ein Browser sie anfordert. Das Erstellen vollständiger dynamischer Websites als Java -Servlets ist jedoch wiederum ziemlich umständlich, da Servlets Java -Klassen sind, während Webseiten HTML sind, die wir dann in Form von String -Konstanten schreiben würden, die an die Ausgabe eines Servlets geschrieben werden sollen.
Die nächste höhere Abstraktion sind Javaserverseiten (JSPs), mit denen wir HTML -Seiten (oder andere Textformate) schreiben und Java -Quellcode in sie einbeziehen können. Die Seiten werden dann erneut von einem Servletbehälter serviert. Immer wenn eine Seite an einen Client gesendet wird, wird der mitgelieferte Java -Code zunächst auf der Serverseite ausgeführt (und kann zusätzliche Ausgaben generieren). Bei näherer Betrachtung können wir feststellen, dass JSPs tatsächlich "spezielle" Servlets sind: Wenn zum ersten Mal auf ein JSP zugegriffen wird, erstellt der Servlet -Container dynamisch den Quellcode eines entsprechenden Java -Servlets. Dieses Servlet wird kompiliert, geladen und dann ausgeführt, um den dynamischen Inhalt der Seite zum Senden an den Client zu erstellen. Alles, was in JSP "Text" war, wird zu einer Zeichenfolge im Servlet, die in die HTTP -Antwort des Servlets geschrieben ist. Alles, was im JSP "Code" war, wird direkt in die Handler -Methoden des Servlets kopiert. JSPs sind ein natürlicherer Weg, um eine dynamische Ausgabe von Text (HTML) zu generieren und einem Kunden zu bedienen. Inzwischen haben wir ein solides Verständnis, wie dynamische Inhalte im Web generiert werden können, wie ein Benutzer mithilfe seines Browsers mit einer Webanwendung über Webformulare interagieren kann und wie wir Sitzungen realisieren können.
Während diese Technologien es uns ermöglichen, eine dynamische "externe" Sicht eines Unternehmens zu erstellen, wie sich das Unternehmen im Web präsentiert, erkunden wir nun die "Insider" -Ansicht der verteilten Enterprise Computing -Umgebung. Hier ist es das Ziel, ein Umfeld aufzubauen, in dem Anwendungen aus verschiedenen Abteilungen (Finanzabteilung, Personalressourcen, Vermögensverwaltung, ...) auf zukünftigsichtige, erweiterbare Weise miteinander verbunden werden können.
Der erste Schritt auf diesem Weg zum Enterprise Computing sind Remote Procedure Calls (RPCS), die wir im Beispiel der Java Remote -Methode -Aufruf (RMI) untersuchen. Unsere Beispiele zeigen, wie auf ein Objekt einer auf dem Computer gehosteten Anwendung aus einem anderen Programm auf einem anderen Computer zugegriffen werden kann. Dies bringt uns bereits kurz vor der Verwirklichung verteilter Anwendungen, die in einem Netzwerk verbunden sind. Java RMI ist jedoch immer noch eine Java-spezifische Technologie und sein Protokoll ist binär. Wir möchten unsere verteilten Anwendungen auf plattformunabhängige Weise implementieren, indem wir sehr klare, gut spezifizierte und leicht verständliche Protokolle verwenden.
Unser Streben nach einer solchen Technologie zwingt uns dazu, zunächst das Lernen über die erweiterbare Markup-Sprache zu lernen (XML. XML ist ein Selbstdokumentationsformat zum Speichern komplexer Datenstrukturen im Text. Es ähnelt HTML, aber ohne vordefinierte semantische oder präsentierte Präsentation. Dies können für jede Anwendung angegeben werden.
Wir diskutieren dann Webdienste. Webdienste sind die grundlegende Grundlage vieler verteilter Enterprise-Computersysteme und Service-orientierten Architekturen. Sie werden unter Verwendung des XML-basierten SOAP-Protokolls in der Regel über HTTP aufgerufen. Ihre Schnittstelle und bereitgestellte Funktionalität werden über die Web -Service -Beschreibung (WSDL), einen anderen XML -Standard, beschrieben. Basierend auf dem, was wir bereits wissen, konnten wir jetzt XML-Daten über HTTP-Post an einen Java-Servlet senden, diese Daten mit diesen Java XML-Verarbeitungstechnologien analysieren, dieselben Technologien verwenden, um ein Ausgabe-XML-Dokument zu generieren und diese als Antwort des JAVA-Servlets zurück zu senden. Tatsächlich konnten wir sogar Javaserver -Seiten für diesen Zweck verwenden. Es gibt jedoch wieder einfacher: Wir können Dienste als einfache Java -Objekte erstellen und auf dem Apache Axis2/Java -Server veröffentlichen. Der Server macht sie über SOAP zugänglich und generiert automatisch WSDL -Beschreibungen. Diese können dann verwendet werden, um Proxy -Objekte für die Client -Seite mithilfe, z. B. Maven zu generieren. Wir untersuchen diese Technologie an mehreren Beispielen.
JSON RPC ist ein weiterer Ansatz (Remote Procedure Call) (hier angegeben), bei dem die ausgetauschten Datenstrukturen in der JavaScript -Objektnotation (JSON) codiert sind. Die Daten werden entweder über HTTP oder TCP ausgetauscht. JSON-RCPs ähneln den Webdiensten, sind jedoch so konzipiert, dass sie leichter sind. Wir diskutieren erneut mehrere Beispiele.
Als letzter wichtiger Anwendungsfall für verteiltes Computing betrachten wir, wie große verteilte Berechnungen realisiert werden können. Solche Berechnungen sind in vielen Szenarien erforderlich, die von Simulationen im Ingenieurwesen bis hin zu Data Mining und Verarbeitung in Unternehmen reichen.
Wir konzentrieren uns nun darauf, wie die Rechenleistung massiver Cluster für groß angelegte wissenschaftliche und technische Berechnungen verwendet werden kann. Solche großen Berechnungen oder Simulationen werden häufig in mehrere kleinere Unterprobleme unterteilt. Diese kleineren Probleme werden dann kooperativ durch mehrere Fäden oder Prozesse parallel gelöst. Dies beinhaltet häufig den Austausch von Nachrichten in regelmäßigen Zeitintervallen zwischen Prozessen, die auf eng verwandten Unterproblemen arbeiten. Natürlich wären Webdienste, Java-Servlets oder sogar Java und das HTTP-Protokoll die falschen Technologien dafür: Für groß angelegte Berechnungen möchten wir mit so wenig Overhead wie möglich so effizient wie möglich werden. Dies betrifft insbesondere die Kommunikation, was sehr teuer ist und der einschränkende Faktor für die Beschleunigung, die wir mit der Verteilung erreichen können. Wir möchten primitive Datentypen effizient austauschen und Kommunikationsparadigmen verwenden, die nicht von HTTP/TCP unterstützt werden, wie z. B. Sendungen, Multicasts und asynchrone Kommunikation. Zu diesem Zweck wäre eine Implementierung der MPI -Schnittstelle (Message Passing Interface) die Methode der Wahl. Wir untersuchen diese Technologie auf der Grundlage mehrerer Beispiele in der C -Programmiersprache.
In einem letzten Schritt diskutieren wir eine Technologie, die die Fähigkeit kombiniert, groß angelegte verteilte Berechnungen (aus der MPI-Welt) mit der reichen Tool-Unterstützung des Java-Ökosystems: MapReduce mit Apache Hadoop zu erstellen. MPI ist die Technologie der Wahl, wenn die Kommunikation teuer ist und der Engpass unserer Anwendung, häufige Kommunikation zwischen Prozessen, die verwandte Unterprobleme lösen, die verfügbare Hardware homogen ist. Prozesse müssen in Gruppen organisiert werden, oder topologischer Strukturen, um effiziente Verwendung der kollektiven Kommunikation zu erzielen, um Hochleistung zu erreichen. Die Größe der Daten, die über die Morymanlegendes gesendet werden müssen, müssen. Heterogen verteilte Anwendungsumgebung. Hadoop dagegen deckt Anwendungsfälle ab, in denen die Kommunikation nicht der Engpass ist, da die Berechnung viel länger dauert als die Kommunikation (denken Sie maschinelles Lernen). Wenn die Umgebung heterogen ist, müssen Prozesse nicht auf besondere Weise organisiert werden, und die Aufteilung von Aufgaben in Aufgaben in Subproben, die effizient sind, indem Sie die Eingangsdaten in die Aufgabe in den Teilen von Subproben, in denen sich die Aufgaben in den Aufgaben in Sub-Problemen befinden. Potenziell riesig (die Vorteile der Kommunikation im MPI-Stil wegfressen) oder woher Daten stammen und die Ergebnisse auf andere Anwendungen in der Umgebung zurückgedrängt werden, z. Unsere Hadoop -Beispiele konzentrieren sich auf das MapReduce -Muster (das in MPI, nur für das oben beschriebene Szenario, ein kleines bisschen wie Streuung/Sammeln/Reduzieren ist).
Insgesamt erhalten Sie in diesem Kurs ein grobes Verständnis der dominierenden Technologien in verschiedenen Bereichen des verteilten Computing, von dynamischen Websites über Unternehmens-Internal-verteilte Anwendungssysteme bis hin zu verteilten technischen und wissenschaftlichen Berechnungen. Jedes Feld wird mit praktischen Beispielen untersucht und Sie können mit mehreren Beispieltechnologien testen und spielen.
Für jedes Beispiel liste ich die erforderliche Software explizit auf und diskutiere, wie sie erhalten und installiert werden kann. Hier gebe ich einen Überblick über diese Softwarekomponenten.
Die meisten Beispiele, die ich bereitete, sind in der Java -Programmiersprache geschrieben und können unter willkürlichen Systemen ausgeführt werden, da Java installiert ist. Um sie zu kompilieren, benötigen Sie eine Java JDK, die installiert ist. Meine Beispiele erfordern Java 7 oder später.
Unter Windows müssen Sie Java von der Oracle -Website herunterladen und installieren.
Unter Linux würden Sie sudo apt-get install openjdk-7-jdk (wo Sie 7 durch eine spätere Version ersetzen können, z. B. 8 , wenn Sie möchten)
Einige meiner Java -Beispiele werden mit Maven gebaut. Alle diese Beispiele haben eine pom.xml -Datei in ihrem Stammordner. Um sie zu bauen, müssen Sie also Maven installieren.
Unter Windows müssen Sie Maven von der Apache -Website herunterladen und installieren.
Unter Linux würden Sie sudo apt-get install maven .
Wenn Sie Eclipse verwenden (siehe unten), müssen Sie Maven nicht installieren, da es bereits in die Eclipse integriert ist.
Ich empfehle Eclipse als Entwicklerumgebung für alle Java -Beispiele in diesem Repository. Jedes Java -Beispiel wird bereits mit einer Eclipse .project -Datei und mit Eclipse .settings . Eclipse integriert sowohl Maven als auch Git. Dies bedeutet, dass Sie dieses Repository innerhalb von Eclipse klonen und die Jave -Projekte während dieses Prozesses direkt importieren können. Wenn pom.xml dann mit der rechten Maustaste auf die Maven -Projekte klicken und Maven -> Update Project... .
Sie können Eclipse von der Eclipse -Website herunterladen. Ich empfehle, mindestens Eclipse Mars.1 für seine hervorragende Unterstützung von Maven und Git zu verwenden.
Um einige der Beispiele für Java -Servlets und Javaserver -Seiten auszuführen, müssen Sie den Glassfish -Server von der entsprechenden Download -Website herunterladen. Ich empfehle, mindestens Glassfish 4.1.2 zu verwenden.
Für das Ausführen der Webdienstbeispiele müssen Sie Apache Axis2/Java von der entsprechenden Download -Seite herunterladen. Ich empfehle, mindestens Achse2 1.7.3 zu verwenden.
Um die in der C -Programmiersprache geschriebenen Beispiele ( C . Unter Linux sollte es normalerweise bereits installiert sein und ansonsten über sudo apt-get install gcc installiert werden. Unter Windows müssen Sie Mingw normalerweise über den Webinstallateur installieren.
Einige der C -Beispiele sind für Windows oder Linux vorhanden. Mit GCC können Sie Cross-Compile, dh wenn Sie Linux verwenden, können Sie C-Programme für Windows kompilieren. Zu diesem Zweck installieren Sie zuerst sudo apt-get install gcc-mingw-w64-i686 und können dann den Befehl gcc-mingw-w64-i686 genauso verwenden, wie Sie gcc unter Mingw verwenden würden.
Um unsere Beispiele für die Verwendung der MPI -Schnittstelle (Message Passing Interface) zu erstellen und zu erstellen, benötigen wir eine MPI -Implementierung. Wir wählen Mpich.
Unter Linux können Sie die erforderlichen Dateien über sudo apt-get install mpich libmpich-dev .
ssh und rsync ) Um unsere Hadoop-Beispiele zu testen, müssen wir nun einen einzelnen Hadoop-Cluster einrichten. Wir folgen daher der Anleitung unter http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.html. Wir müssen Voraussetzungen wie ssh und rsync installieren. Im Hadoop -Beispiel Readme bieten wir den Installationshandbuch für Hadoop 2.7.2 Linux / Ubuntu an. Es läuft darauf hinaus, Hadoop von einem der Spiegel herunterzuladen und zu installieren, die unter http://www.apache.org/dyn/closer.cgi/hadoop/common/ sowie den Richtlinien des verknüpften Tutorials entspricht.
Diese Arbeit hat rein Bildungszwecke. Neben allem, was unten erwähnt wurde, setze ich für alles in diesem Repository eine zusätzliche Lizenzbedingung auf: Der Code darf niemals für irgendetwas verwendet werden, was gegen die Gesetze Deutschlands, China oder den USA verstoßen könnte. Dies gilt auch für eine andere hier bereitgestellte Datei oder Ressource.
Die Beispiele in diesem Repository sind unter der GNU General Public Lizenz Version 3, 29. Juni 2007 mit den folgenden Ausnahmen lizenziert:
Alles in den Verzeichnissen /Javaserverpages /Standalonejspswithjetty und /JavaServlets /Proxy wird unter der Apache-Lizenz v2.0 lizenziert und wird teilweise von der Projekt eingebettet-Jetty-JSP mit Copyright (C) 1995-2013 Mort Bay Consulting Pty. LTD.
Einige der Hadoop-Beispiele lassen sich von H3ML3T inspirieren, für die keine Lizenzinformationen bereitgestellt werden. Die Beispiele sind in mehrfacher Hinsicht ganz anders, beispielsweise in der Art und Weise, wie wir Fettgläser bauen. Wie auch immer, dieses Originalprojekt wird in diesem Blogeintrag schön beschrieben.
Darüber hinaus basiert das unser Hadoop-Wort auf dem bekannten Beispiel für die Wortzählung für Hadoops Karte, die die Funktionalität reduziert. Es basiert auf der Version von Luca Menichetti [email protected] unter der GNU General Public Lizenz Version 2.