分散システムは今日どこにでも私たちを囲んでいます。彼らの最も顕著な例は、World Wide Webをホストするインターネットです。エンタープライズコンピューティングシステムのコンピューティング環境も多くの場合分散されており、人事、金融部門、資産管理システムとの異なるサービスを相互に接続しています。多くのアプリケーションもクラウドでホストされています。最後に、今日の大規模なエンジニアリングと科学的コンピューティングは、ワークロードを並列化するためにクラスターに大きく依存しています。これらのトピックは、私の分散コンピューティングレクチャーで説明されています。このリポジトリでは、私のコースで使用している実用的な例を見つけることができます。
ソケット
c
Javaで
HTML、CSS、およびJavaScript
Javaサーブレット
展開可能な例
HTTPプロキシサーブレット
Javaserverページ
展開可能な例
スタンドアロンJSP
Java Rmi
XML
XMLドキュメントと関連標準の例
Javaを使用したXML処理の例
Webサービス
JSON RPC
メッセージの通過インターフェイス
Hadoop
上記のリンクのそれぞれは、一連の例を含むサブディレクトリにつながります。各サブディレクトリには、詳細な説明を含む独自のREADME.mdファイルがあります。
スライドに同じコードも使用するため、コードでフォーマットするために//(*@serverBox{2)}@*)などの特別なコメントがいくつかあります。安全に無視できます ^_ ^
このコースの概念は、Webと分散のエンタープライズアプリケーション環境がどのように機能するかを理解したいということです。プログラマーであるSocket APIが利用できる最低レベルの抽象化(通常)でネットワークを介して通信する方法を探求し始めることで、それをしたいと考えています。そこから、私たちは段階的なより高いレベルの抽象化、すなわち、よりシンプルでより強力なAPIスタッキング(そして最終的にソケットに接地されている)を段階的に段階的に上げます。このようにして、分散アプリケーションとWeb作品がどのように機能するかを確実に理解することができます。私たちはウェブサイトを見ることができ、すぐにそれがどのように機能するかについて、ナットやボルトに至るまでの大まかな理解を得ることができます。したがって、私たちが探求する抽象化のレベルごとに、テクノロジーの例を常に学びます。
前述のように、私たちは非常に一番下から始めます。今日の分散システムでの通信は、通常、UDPまたはTCPに基づいています。両方のプロトコルにはソケットAPIを介してアクセスされ、CとJavaの両方の例を提供します。これらの例の一部として、Javaでテキストをエンコードする方法と、複数のリクエストを並行して処理できるサーバーを構築する方法も示します。したがって、ソケットは分散アプリケーションのまさに基礎であり、プログラマーが機能しなければならない最低レベルです。
現在、事実上すべての現在のコンピューターネットワークとインターネットで進行中の基本的な通信プロセスを理解できるようになりました。この理解を使用して、組織や企業がウェブサイトを介して外国にどのように現れることができるかを調査します。ユーザーと動的に対話できるWebサイトを構築するために必要なテクノロジーを理解したいと考えています。
World Wide Webは、HTTP、HTML/CSS/JavaScript、およびURLの3つの柱に基づいています。ハイパーテキスト転送プロトコルであるHTTPは、通常TCP接続を介して送信されるリソースを照会するためのテキストベースのプロトコルです。実際、ソケットを使用してHTTP通信のサーバー(Webサーバー)とクライアント(Webブラウザー)クライアント側の両方の実装を既に提供しています(および小さな並列Webサーバーもあります。その後、HTML、CSS、およびJavaScriptの基本的な例をいくつか提供します。
ソケットに基づいてHTTPの実装は非常に複雑です。ソケットにより、TCPにアクセスできます。私たちが持ちたいのは、HTTPにアクセスするための同様にエレガントなAPIです(次に高いレベルの抽象化)。そのような技術の1つはJavaサーブレットです。サーブレットは、HTTP会話のサーバー側を実装するために使用されます。サーブレットは、さまざまなHTTP相互作用のハンドラーメソッド(「HTTPメソッド」)を実装する特別なJavaクラスのサブクラスです。これらのメソッドは、サーバーの実際の実装であるサーブレットコンテナによって呼び出されます。したがって、アプリケーションロジックに完全に集中することができ、プロトコルの相互作用自体を心配する必要はありません。展開可能な例と、スタンドアロンのHTTPプロキシサーブレットの両方で、Javaサーブレットに幅広い例を提供します。そのため、Javaサーブレットを使用すると、HTTPクライアント(Webブラウザーなど)と動的に対話できるサーバーコンポーネントを構築できます。これは、ブラウザがそれらを要求したときに、Webページのコンテンツを動的に生成できることを意味します。ただし、サーブレットはJavaクラスであり、WebページはHTMLであるため、Javaサーブレットとして完全な動的Webサイトを構築することは非常に面倒です。これは、サーブレットの出力に書き込まれる文字列定数の形で書き込みます。
次の高レベルの抽象化は、Javaserverページ(JSP)です。これにより、HTMLページ(またはその他のテキスト形式)を作成し、Javaソースコードを含めることができます。その後、ページはサーブレットコンテナによって再度提供されます。ページがクライアントに送信されるたびに、付属のJavaコードがサーバー側で最初に実行されます(および追加の出力が生成される場合があります)。綿密な検査で、JSPは実際には「特別な」サーブレットであることがわかります。JSPに初めてアクセスすると、サーブレットコンテナが対応するJavaサーブレットのソースコードを動的に作成します。このサーブレットは、クライアントに送信されるページの動的コンテンツを作成するためにコンパイル、ロード、および実行されます。 JSPの「テキスト」であったものはすべて、サーブレットのHTTP応答に書き込まれるサーブレット内の文字列になります。 JSPの「コード」であったものはすべて、サーブレットのハンドラーメソッドに直接コピーされます。 JSPは、テキスト(HTML)出力を動的に生成し、クライアントに提供するためのより自然な方法です。今では、Web内の動的なコンテンツを生成する方法、ユーザーがブラウザを使用してWebフォームを介してWebアプリケーションと対話する方法、およびセッションを実現する方法を確実に理解しています。
これらのテクノロジーにより、会社の動的な「外部」ビューを構築することができますが、会社がWebで自分自身を提示する方法は、分散したエンタープライズコンピューティング環境の「内部」ビューを探求します。ここでの目標は、さまざまな部門(財務部門、人事、資産管理など)からのアプリケーションを将来の安全で拡張可能な方法で互いに接続できる環境を構築することです。
エンタープライズコンピューティングへのこの道の最初のステップは、リモート手順呼び出し(RPC)です。これについては、Javaリモートメソッドの呼び出し(RMI)の例で調査します。私たちの例は、コンピューターでホストされている1つのアプリケーションのオブジェクトが、別のコンピューターで実行されている別のプログラムからどのようにアクセスできるかを示しています。これにより、ネットワーク上に相互接続された分散アプリケーションの実現にすでに近づきます。ただし、Java RMIは依然としてJava固有のテクノロジーであり、そのプロトコルはバイナリです。非常に明確で、よく指定された、理解しやすいプロトコルを使用して、分散型アプリケーションをプラットフォームに依存しない方法で実装したいと考えています。
このようなテクノロジーの追求により、最初に拡張可能なマークアップ言語について学習することのツールを取得する必要があります(XML。XMLは、テキストに複雑なデータ構造を保存するための自己文書化形式です。それはHTMLに似ていますが、事前に定義されたセマンティックまたはプレゼンテーションはありません。これらは両方とも、XMLドキュメントを使用して、XMLドキュメントと同様に、XMLドキュメントを検討していることを検討します。
次に、Webサービスについて説明します。 Webサービスは、多くの分散エンタープライズコンピューティングシステムとサービス指向アーキテクチャの基本的な基盤です。通常、HTTPを介してXMLベースのSOAPプロトコルを使用して呼び出されます。それらのインターフェイスと提供された機能は、別のXML標準であるWebサービス説明言語(WSDL)を介して説明されています。すでに知っていることに基づいて、HTTP-POSTを介してXMLデータをJavaサーブレットに送信し、これらのJava XML処理技術でこのデータを解析し、同じテクノロジーを使用して出力XMLドキュメントを生成し、Javaサーブレットの応答としてこれを送信できます。実際、この目的のためにJavaserverページを使用することもできます。ただし、より簡単な方法があります。単純なJavaオブジェクトとしてサービスを構築し、Apache Axis2/Javaサーバーに公開できます。サーバーは、SOAPを介してアクセス可能になり、WSDLの説明を自動的に生成します。これらを使用して、Mavenを使用してクライアント側のプロキシオブジェクトを生成できます。この技術をいくつかの例で調査します。
JSON RPCは、交換されたデータ構造がJavaScriptオブジェクト表記(JSON)でエンコードされる別のリモートプロシージャコール(RPC)アプローチ(ここで指定)です。データは、HTTPまたはTCPを介して交換されます。 JSON RCPはWebサービスに似ていますが、より明るい重みになるように設計されています。再びいくつかの例について説明します。
分散コンピューティングの最後の重要なユースケースとして、大規模な分散計算がどのように実現できるかを検討します。このような計算は、エンジニアリングのシミュレーションから企業のデータマイニングと処理に至るまで、多くのシナリオで必要です。
現在、大規模な科学およびエンジニアリングの計算に、大規模なクラスターのコンピューティングパワーをどのように利用できるかに焦点を当てています。このような大規模な計算またはシミュレーションは、多くの場合、いくつかの小さなサブ問題に分けられます。これらの小さな問題は、複数のスレッドまたはプロセスによって並行して協力的に解決されます。これには、多くの場合、密接に関連するサブ問題で動作するプロセス間の定期的な時間間隔でメッセージの交換が含まれます。明らかに、Webサービス、Javaサーブレット、またはJavaとHTTPプロトコルだけでさえ、そのための間違ったテクノロジーになります。大規模な計算では、できるだけ少ないオーバーヘッドで可能な限り効率的になりたいと考えています。これは特にコミュニケーションに関係しています。これは非常に高価であり、流通で達成できるスピードアップの制限要因です。原始データ型を効率的に交換したいと考えており、ブロードキャスト、マルチキャスト、非同期通信など、HTTP/TCPでサポートされていない通信パラダイムを使用したいと考えています。このためには、メッセージパッシングインターフェイス(MPI)の実装が選択の方法です。 Cプログラミング言語のいくつかの例に基づいて、このテクノロジーを探ります。
最後のステップでは、(MPIの世界から)大規模な分散計算を作成する能力と、Javaエコシステムの豊富なツールサポートであるApache Hadoopとの豊富なツールサポートを組み合わせたテクノロジーについて説明します。 MPIは、通信が高価でアプリケーションのボトルネックである場合、関連するプロセスの間で頻繁なコミュニケーションが必要な場合、MPIは選択の技術です。利用可能なハードウェアは均一であり、プロセスはグループまたはトポロジ構造で編成する必要があります。不均一な分散アプリケーション環境。一方、Hadoopは、通信がボトルネックではないユースケースをカバーしています。これは、環境が不均一である場合、コンピューティングが通信(機械学習を考えてください)よりもはるかに長いため、プロセスを特別な方法で整理する必要はなく、サブプルームに分割することができます。潜在的に巨大(MPIスタイルの通信の利点を食べる)、またはデータが生まれ、結果を環境内の他のアプリケーションに押し戻す必要があります。 Hadoopの例は、MapReduceパターンに焦点を当てています(上記のシナリオのために、MPIでの散布/収集/削減に少し似ています)。
全体として、このコースでは、会社内分散アプリケーションシステムを介した動的なWebサイトから、分散エンジニアリングおよび科学的計算まで、分散コンピューティングのさまざまな分野の支配的なテクノロジーを大まかに理解することができます。各フィールドは実践的な例で調査され、いくつかの例のテクノロジーでテストして遊ぶことができます。
各例について、必要なソフトウェアを明示的にリストし、その取得とインストール方法について説明します。ここでは、これらのソフトウェアコンポーネントの概要を説明します。
私が提供する例のほとんどは、Javaプログラミング言語で書かれており、Javaがインストールされていることを考えると、任意のシステムで実行できます。それらをコンパイルするには、Java JDKをインストールする必要があります。私の例では、Java 7以降が必要です。
Windowsの下では、Oracle WebサイトからJavaをダウンロードしてインストールする必要があります。
Linuxでは、 sudo apt-get install openjdk-7-jdk (必要に応じて8などの後のバージョンに7置き換えることができます)
私のJavaの例のいくつかは、Mavenで構築されています。これらのすべての例には、ルートフォルダーにpom.xmlファイルがあります。したがって、それらを構築するには、Mavenをインストールする必要があります。
Windowsの下では、ApacheのWebサイトからMavenをダウンロードしてインストールする必要があります。
Linuxでは、 sudo apt-get install maven行います。
Eclipseを使用している場合(以下を参照)、Eclipseに既に統合されているため、Mavenをインストールする必要はありません。
このリポジトリのすべてのJavaの例について、Eclipseを開発者環境としてお勧めします。各Javaの例には、実際には既にEclipse .projectファイルとEclipse .settingsが付属しています。 EclipseはMavenとGitの両方を統合します。これは、このプロセス中にこのリポジトリをEclipse内からクローンし、Javeプロジェクトを直接インポートできることを意味します。その後、Mavenプロジェクトを右クリックしてMaven > Update Project...を選択した場合、EclipseはMaven pom.xmlが指定したすべての必要なライブラリと依存関係をダウンロードして使用します。
Eclipse WebサイトからEclipseをダウンロードできます。優れたMavenとGitサポートのために、少なくともEclipse Mars.1を使用することをお勧めします。
JavaサーブレットとJavaserverページの例をいくつか実行するには、対応するダウンロードWebサイトからGlassfishサーバーをダウンロードする必要があります。少なくともGlassfish 4.1.2を使用することをお勧めします。
Webサービスの例を実行するには、対応するダウンロードページからApache Axis2/Javaをダウンロードする必要があります。少なくともaxis2 1.7.3を使用することをお勧めします。
Cプログラミング言語( Cベースのソケットの例など)で記述された例をコンパイルするには、GCCなどのCコンパイラが必要です。 Linuxの下では、通常はすでにインストールされている必要があり、それ以外の場合はsudo apt-get install gccを介してインストールできます。 Windowsの下には、通常はWebインストーラーを介してMingwをインストールする必要があります。
Compleのいくつかは、WindowsまたはLinux用に提供されます。 GCCを使用すると、クロスコンパイルできます。つまり、Linuxを使用している場合は、Windows用のCプログラムをコンパイルできます。この目的のために、最初にsudo apt-get install gcc-mingw-w64-i686し、次にMINGWの下でgccを使用するのと同じ方法でコマンドgcc-mingw-w64-i686を使用できます。
メッセージパッシングインターフェイス(MPI)を使用するための例を構築およびコンパイルするには、MPI実装が必要です。 mpichを選択します。
Linuxの下で、 sudo apt-get install mpich libmpich-dev介して必要なファイルをインストールできます。
sshとrsyncも) Hadoopの例をテストするには、単一ノードのHadoopクラスターを設定する必要があります。したがって、http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/singlecluster.htmlで与えられたガイドに従います。 sshやrsyncなどの前提条件をインストールする必要があります。 Hadoopの例ReadMeでは、Hadoop 2.7.2 Linux / Ubuntuのインストールガイドを提供します。 http://www.apache.org/dyn/closer.cgi/hadoop/common/で提供されているミラーの1つからHadoopをダウンロードしてインストールすることに加えて、リンクされたチュートリアルのガイドラインに続きます。
この仕事には純粋に教育的な目的があります。以下に言及したすべてに加えて、このリポジトリのあらゆるものについて、私は追加のライセンス条件を1つ課しています。ドイツ、中国、または米国の法律に違反する可能性のあるものには、コードを使用してはなりません。これは、ここで提供される他のファイルまたはリソースについても保持されます。
このリポジトリの例は、2007年6月29日、GNU General Public Licenseバージョン3に基づいてライセンスされています。
ディレクトリ /javaserverpages /standalonejspswithjettyおよび /javaservlets /proxyのすべては、Apacheライセンスv2.0に基づいてライセンスされており、著作権(c)1995-2013モートベイコンサルティングPTYを備えたプロジェクト組み込みjetty-jspから部分的に派生しています。
Hadoopの例のいくつかは、H3ML3TによるMaven-Hadoop-Java-WordCount-Templateからインスピレーションを得ています。例は、たとえば脂肪瓶を構築する方法など、いくつかの点で完全に異なっています。とにかく、このオリジナルプロジェクトは、このブログエントリでうまく説明されています。
さらに、Hadoopの単語は、Hadoopのマップ削減機能の有名な単語カウントの例に基づいています。これは、GNU General Public Licenseバージョン2の下で、Luca Menichetti [email protected]の提供によりバージョンに基づいています。