Apache Hadoop
Apache Hadoopとは、Doug Cutting(@cutting)氏によって生み出された、分散データ処理基盤の定番と言えるオープンソースソフトウェアであり、現在はApache Software Foundationにおけるトップレベルプロジェクトの1つです。
Yahoo!やFacebook, 楽天など、大量のデータ処理を必要とするWebサービス企業での大規模事例は、Hadoopユーザならずとも一度は耳にしたことがあるのではないでしょうか。
そんなHadoopですが、筆者の生息する「Microsoft文化圏」ではあまり身近な存在でなかったことも確かです。Hadoopの大部分はJavaで書かれているため一見どこでも動きそうなのですが、Javaプログラム内からchmodやkillなどのUNIXコマンドを呼び出していたり、コマンド群がbashのスクリプトだったりと、Windows環境で動かすにはいくつかハードルがあったからです。
HADOOP-8079,そしてHDInsight
もう2年ほど前になりますが、Hadoop Commonプロジェクトに次のような提案が出されました。
"Proposal for enhancements to Hadoop for Windows Server and Windows Azure development and runtime environments"
https://issues.apache.org/jira/browse/HADOOP-8079
当時Microsoftでは、“ Isotope” というコードネームの元、Hadoopを「ネイティブに」Windows上で動かすための作業を、Hortonworks社 と協同で進めていました。HADOOP-8079はその最初の対外的な成果物と言えるものであり、Windows上でHadoopを動かすためのパッチや、hadoopコマンドなどの各種bashスクリプトをcmd.exe用に移植したものが含まれていたのです。
なお、「 Windows上でネイティブに動かす」と言っても、Windows環境に特化した「亜種」を作り出したわけではありません。必要最低限の地味な修正で、オリジナルのHadoopがそのままWindowsで動くようにしたのです。
以下は変更部分の一例です。
--- core/org/apache/hadoop/util/Shell.java (revision 1293380)
+++ core/org/apache/hadoop/util/Shell.java (working copy)
@@ -45,17 +45,19 @@
public final static String USER_NAME_COMMAND = "whoami";
/** a Unix command to get the current user's groups list */
public static String[] getGroupsCommand() {
- return new String[]{"bash", "-c", "groups"};
+ return (WINDOWS)? new String[]{"cmd", "/c", "groups"}:
+ new String[]{"bash", "-c", "groups"};
}
その後、この活動はHortonworks社のHadoopディストリビューションである“ Hortonworks Data Platform” のWindows版、” HDP for Windows” として結実しました。
これを、MicrosoftのパブリッククラウドであるWindows Azureで利用できるようにしたものが、今回の主題「Windows Azure HDInsightサービス」です。
Hadoopクラスタも「所有」から「利用」へ
数十、あるいは数百ノードにおよぶHadoopクラスタをすべて自前で構築・運用するのは、なかなか手間のかかるものです。また、たとえば夜間バッチ処理のように「常に利用するわけではない」クラスタのために多数のハードウェアを所有するのは必ずしも効率的ではありません。
その点、HDInsightサービスのような「クラウドHadoop」であれば、使いたいときに動的にクラスターを生成してジョブを投入し、処理が終わればクラスタをきれいさっぱり削除してしまえば良いわけです。
Windows Azure管理ポータル で、HDInsightクラスターの「簡易作成」を選ぶと、図1 のような簡単な操作で、32ノードまでのクラスタを作成可能です。
図1 HDInsightクラスタの作成
Azure上にできあがったHDInsightクラスターは、図2 のような構成になっています。
図2 HDInsightサービスのシステム構成
ネームノード、データノードはおなじみのものです。これらはWindows Azureクラウドサービスの「Workerロール」のインスタンスとして実行されます(ゲストOSは今のところWindows Server 2008 R2です) 。
では、「 BLOBストレージ」とは何でしょうか?
HDInsightとBLOBストレージ
BLOBストレージはWindows Azureの基本機能の一つで、非常に大容量(1ストレージアカウントあたり200TBまで)かつ安価(1Gバイト/1ヵ月で6円程度)なストレージサービスです。
実はHDInsightでは、Hadoopの大きな特徴であるHDFSではなく、このBLOBストレージをデフォルトのファイルシステムとして利用します。これは、次のような理由によります。
データはそこ(BLOB)にある
BLOBストレージはWindows Azure上のデータ集積場所として広く利用されているため、分析対象データは「すでにBLOBに存在する」ことが多いです(Windows Azure DiagnosticsによってBLOBストレージへ収集されるログファイルなどは典型的な例) 。そのため、BLOBをそのまま分散ファイルシステムとして扱うことで、データを一旦HDFSへコピーする方式よりも効率的にMapReduce処理を実行することができます。
コスト効率
HDInsightサービスでは、処理を実行しない時間はクラスタを削除することで課金を抑制できます。しかし、HDFSの実体はデータノードのローカルディスクであり、クラスタを削除すると当然失われてしまいます。データをBLOBストレージに配置することで、「 処理を実行する間だけクラスタを起動する」という効率の良い使い方が可能になります。
また、BLOBストレージには、それにアクセスするためのクライアントツールが豊富に存在しますが、これらのツールをそのままHDInsightクラスタとのやりとりに利用できるというメリットもあります。
GUIツールの一例としては、以下のようなものがあります。
この他、コマンドラインツールの“ AzCopy” も利用可能です。これはWindows環境でよく利用されている“ robocopy” と似た書式で、WindowsマシンとBLOBストレージ間(あるいは、2つの異なるBLOBストレージ間)でファイルのコピーを行える便利なコマンドです。AzCopyはこちらからダウンロード可能です。
なお、BLOBストレージは、多くのストレージサーバが高速なネットワークで接続された分散ストレージサービスです。HDFSのような“ Rack Awareness” こそありませんが、データを自動的に複数のサーバに分散配置し、かつ最低3つのレプリカを維持することで性能と信頼性を確保しています。その詳細なアーキテクチャについては、設計者自身がSOSP に発表した論文が非常に面白いので、ぜひご覧ください。
また、BLOBストレージの性能についてはこちらに情報があります。
Excelなどから簡単にアクセス
クラスタの構築が容易であるだけでなく、「 Excelのような身近なツールでデータにアクセスできる」ということもHDInsightの大きな利点です。
Hive ODBC Driver
Windows PCにこのドライバをインストールすると、HDInsight上のHiveテーブルをODBCのデータソースとすることができます。まるで普通のデータベースであるかのように、Hiveを利用できるわけです。
Hive ODBC Driverはこちらからダウンロードできます。
また、ドライバのダウンロード、ODBCデータソースの構成、Excelからの接続という一連の手順が、次のページで説明されています。
Power Query for Excelを使ったHDInsightへの接続
Power Query for Excel は、さまざまなデータソースからのデータ取り込みを実現するExcelのアドインです。Facebookのフィードを取り込むデモを最近よく見るのですが、そのたびにメニューにある“ From Windows Azure HDInsight” (図3 )のほうが気になってしまうのは私だけでしょうか。
図3 PowerQueryはHDInsightのデータを取り込める
Hive ODBC Driverがあくまで「Hiveのテーブル」を対象とするものであるのに対し、Power QueryはHadoopのファイルシステムを直接見に行きます。HDInsightの場合は、BLOBストレージ上のファイルを何でも取り込めるということになります。
こちらも、一連の手順が次のページで説明されています。
HDInsight活用事例
HDInsightサービスは、正式リリース前からMicrosoft社内のさまざまなプロジェクトで利用されていました。中でも、Xbox 360用のゲーム“ Halo 4” を開発した“ 343 Industries” での活用例は大規模です。
Halo 4のマルチプレーヤ機能などの重要なバックエンドサービスは、Windows Azure上に構築されており、それゆえゲームデータはすべてAzure上に存在します。彼らはこの膨大なデータをもとにユーザの行動を分析するソリューションとして、HDInsightを採用しました。データをBLOBストレージに保存し、Hive ODBC Driverを通じてアクセスできるようにしたのです。
フロントエンド側はPowerPivot for SharePointを利用して、Webブラウザでレポートを閲覧できるようにしました。これによって、ユーザーのプレイ時間やよく利用される機能といった傾向を把握し、迅速にアップデートをリリースすることができたのです。
今後も様々な分野でHDInsightが活用されることでしょう。
次回は実践編
今回は、Windows Azure HDInsightサービスの成り立ちと概要をお伝えしました。
次回は、Microsoft .NET SDK For Hadoopを使ってC#でMapReduceプログラムを作成するなど、実践的な内容を予定しています。