最近注目を浴びている分散処理技術「MapReduce」の利点をサンプルからアルゴリズムレベルで理解し、昔からあるJava関連の分散処理技術を見直す特集企画(編集部)
Javaはネットワークプログラミング向けのjava.netパッケージが標準で備わっていることからも分かるように、もともとネットワークを強く意識した言語仕様となっています。そのため筆者は、「Javaはネットワークを利用した分散処理にも強い」というイメージを持っています。前回の「GoogleのMapReduceアルゴリズムをJavaで理解する」で説明した、分散処理技術で最近注目を浴びているMapReduceもJavaによる実装があります。
それは、Apache Hadoopプロジェクトで開発されているものです。このプロジェクトは、もともとはオープンソースの検索ソフトウェアであるApache Luceneのサブプロジェクトでしたが、2008年1月23日にApacheのトッププロジェクトになっています。
Apache Hadoopの使い方やソースコード例を解説する前に、今回はJavaでも使える分散処理技術やWebサービスについて簡単にお話しします。
Javaでは、言語仕様にマルチスレッド向けクラスライブラリや、ネットワーク用クラスライブラリが含まれていたので、登場した当時から分散処理のプログラムを実装しやすかった覚えがあります。Java 1.0.2のころはjava.net.Socketクラスやjava.net.ServerSocketクラスをよく使って、C/S(クライアント/サーバ)モデルのプログラムを作成していたものです。
C/Sモデルでは、「負荷の高い計算などをサーバ側で実行して、クライアント側はリクエストをサーバに出して、結果を受け取って表示したりする機能を持つ」という役割分担をします。サーバはサービスを提供するもの、クライアントはサービスを利用するもの、という関係にあります。
C/Sシステムを作成するには、システム間でデータをやりとりするための通信プロトコルを設計して実装をする必要があります。Webシステムでは、HTTPを使って通信をしますが、独自システムを開発する場合で特別なプロトコルが必要な場合は、自分で設計をすることになるので、結構大変です。
とはいえ、JavaではBSD系UNIXのソケット通信をサポートするクラスとして、java.net.Socketとjava.net.ServerSocketがあったので、当時としては随分楽にプログラムを作成できました。
Linuxなどで使われているX Window Systemでは、画面描画機能を提供するのが「X Server」で、各アプリケーションは「X Client」として、X Serverへ画面描画を依頼しています。
ですから、X Serverは各自のデスクトップを表示するコンピュータで動作させて、アプリケーションはパワフルなマシンにインストールしておいて、それを呼び出して使います。名前からすると、「X Serverはサーバマシンへインストールして動作させるものだ」と勘違いしやすいので気を付けましょう。
ちなみにWindowsでは、似たような機能を実装したものとして「リモートデスクトップ」があります。Windows XPやVistaの安価バージョンでは使えませんが、便利なので筆者は使えるバージョンのWindowsを購入して使っています。
ソケット通信が簡単に実装できるというのはよかったのですが、オブジェクト指向プログラマーからすると、「通信プロトコルを設計してネットワークの向こうにあるオブジェクトを操作できるようにする」というのが面倒に感じられます。そこで、これを簡単に実現する方法として、JavaではJava RMI(Remote Method Invocation)つまり、java.rmiパッケージが提供されるようになりました。下記の図ではJ2EE(Java EE)を例としていますが、J2SE(Java SE)でもRMIは使用できます。
Java RMIを使うと、Javaでリモートオブジェクトのメソッドを呼び出して利用できます。通信手順などを考える必要はなく、普通にオブジェクトのメソッドを呼び出すようにプログラムを記述できるので、非常に簡単にプログラミングができます。例えば、「y = o.method(x);」のように記述できるわけです。
Java RMIを使うためには、もちろんこれだけではなく、いろいろと準備が必要ですが、環境さえ用意できれば、このようにプログラム中で簡単に使えるようになります。
「ネットワーク上に分散しているオブジェクトをネットワーク透過的にプログラムから利用できるようにする」という分散オブジェクト技術には、Java RMIのほかにもあります。OMG(Object Management Group、オブジェクト指向技術のための標準化団体)によるCORBA(Common Object Request Broker Architecture)などです。
CORBAを使うと、異なるプログラミング言語で実装されたソフトウェアがさまざまなコンピュータ上で動作している環境で、ソフトウェアコンポーネントを相互利用できます。
CORBAをインターネット/イントラネットで使うには、IIOP(Internet Inter-ORB Protocol)というプロトコルを使うのですが、実際のネットワーク運用環境では、このプロトコルはファイアウォールを通過できないように設定されていることが多いはずです。HTTPを閉じているネットワークはほとんどないと思いますが、IIOPを閉じているネットワークは非常に多いのではないでしょうか。このため、IIOPを利用してインターネット上で稼働する分散システムを作るということは少ないのです。
ちなみに、Javaには関係するパッケージとして、javax.rmi.CORBAパッケージやorg.omg.CORBAパッケージがあったりします。
Java RMIやCORBAの基礎技術としては、RPC(Remote Procedure Call)があります。これはその名のとおり、「リモートのプロシージャを呼び出して利用する」、つまり「ネットワーク上にある別のマシンで処理を実行して結果を得る」というものです。
RPCでは、いわゆるオブジェクト指向の「オブジェクト」という概念はありません。例えば、リモートのプロシージャ「f」を呼び出して結果を得るためには、「y = f(x);」のように書くことができます。こちらもJava RMIと同様にいろいろ準備が必要です。
RPCといえば、「XML-RPC」というものもあります。「XML-RPC Home Page」によると、データエンコードにXMLを、通信プロトコルにHTTPを使ったRPCが、XML-RPCになります。例えば、「f(1)」のような処理を呼び出すには、下記のXMLをHTTPのPOSTメソッドを使ってWebサーバへ投げます。
<methodcall> <methodname>f</methodname> <params> <param><value><int>1</int></value></param> </params> </methodcall>
JavaでXML-RPCのプログラムを開発するときには、「Apache XML-RPC」などを使います。
分散環境にあるマシン間で、直接、データ構造や型を持った情報(オブジェクト)をやりとりするためのプロトコルとして、SOAP(以前は Simple Object Access Protocolの略でしたが、SOAP 1.2からは固有名詞)があります。
SOAPは基本的に、状態を持たない、一方向のメッセージ交換用のプロトコルです。主にWebサービスにおけるメッセージ交換で使われています。通信をするアプリケーションにはSOAPを生成・解釈するエンジンが必要になります。
XML-RPCほど単純ではありませんので、例は挙げませんが、SOAP HeaderとSOAP Bodyから構成されるSOAP Envelopeにより、メッセージは表現されます。SOAP 1.1で下位の通信プロトコルとしてHTTP、SMTP、FTPなどから選択できるようになったことからも分かるように、XML-RPCとは違って、下位の通信プロトコルはHTTPだけというわけではありません。
SOAPのJavaによる実装としては、「Apache Axis 2」や「XFire」があります。
次ページでは、引き続き分散処理技術の1つとして、JAX-WSやREST、Apache Thriftなどついて簡単に説明し、MapReduce/Hadoopとほかの技術の違いを述べます。
Copyright © ITmedia, Inc. All Rights Reserved.