Jeffrey Cross
Jeffrey Cross

Hadoop MapReduceジョブを任意のプログラミング言語で書く

HadoopはJavaベースの分散アプリケーションとストレージフレームワークで、何千ものコモディティマシン上で動作するように設計されています。これは、Googleの検索インフラストラクチャのオープンソース近似と見なすことができます。実際、Yahoo!はHadoop上で同社の検索および広告製品の多くのコンポーネントを実行しています。そして、それらがプロジェクトへの主要な貢献者であることはそれほど驚くべきことではありません。

MapReduceは、膨大な量のデータを処理するために何千ものマシンにわたって並列化できるソフトウェアを書くための方法です。たとえば、世界中のApacheサーバーログで、ドメイン別に紹介の数を数えたいとしましょう。これがあなたのやり方の要点です。

  1. あなたのgigantor分散ファイルシステムに彼らのサーバーログをアップロードするために全世界を入手してください。すべてのWeb管理者が自分のサイトにJavaScriptコードを追加して訪問者のブラウザが自分のサーバーにpingを送信するようにすることで、これを自動化して近似することができます。選択するファイルシステムは、HDFS(Hadoop Distributed Filesystem)です。これは、この膨大なファイルをすべてのクラスターノード間でパーティション分割して複製する処理を行います。
  2. 世界最大のログファイルを小さな部分に分割し、何千ものクラスタマシンでそれらの部分を解析して、参照元を探します。これが「マップ」フェーズです。各チャンクは処理され、そのチャンク内で見つかった参照元はシステムに出力され、参照元ホスト名がキーとなる出力が格納されます。チャンク割り当ては、クラスタノードが分散ファイルシステムのローカルフラグメントに格納されることがあるデータのチャンクを処理するように最適化されています。
  3. 最後に、Mapフェーズからのすべての出力が照合されます。これは「削減」フェーズと呼ばれます。クラスタノードには、マップフェーズで作成されたホスト名キーが割り当てられています。そのキーのすべての出力はノードによって読み込まれ、カウントされます。次にノードは、参照元のドメイン名とその参照元から生成された参照の総数である単一の結果を出力します。これは、参照元ドメインごとに1回、数十万回行われ、数千ものクラスタノードに分散されます。

この架空のMapReduceの仕事の終わりには、トラフィックを参照している各ドメインの簡潔なリストと、それが与えられた参照の数が残ります。 HadoopとMapReduceの素晴らしいところは、このような分散アプリケーションの作成が驚くほど簡単になることです。リファラーの解析例を実行するための2つの関数は、わずか20行のコードです。 Hadoopは、分散ストレージと分散処理の莫大な課題を解決し、お客様が特定のタスクに集中できるようにします。

HadoopはJavaで書かれているので、分散ジョブを作成するための自然な方法は、MapおよびReduce関数をJavaクラスにカプセル化することです。しかし、あなたがJavaの中毒者ではないのであれば、心配する必要はありません。HadoopStreamingというジョブラッパーがあり、通常のSTDINとSTDOUTを使用して作成したプログラムと通信できます。これにより、分散ジョブをPerl、Python、さらにはシェルスクリプトで作成できます。 1つはマッパー用、もう1つはリデューサー用の2つのプログラムを作成します。HadoopStreamingはそれらをすべてのクラスターノードにアップロードし、プログラムとの間でデータをやり取りします。

これを試してみたいのなら、ドイツ人ハッカーMichael G. Nollが書いた2、3のハウツーを本当にお勧めします。彼は、HadoopをUbuntu上で稼働させるためのウォークスルーと、HadoopStreamingを使用してMapReduceプログラムを作成するための素晴らしい入門書(Pythonを例として)をまとめました。

Hadoopを使っている読者はいますか?あなたがしていることを私たちに知らせてください、そしてコメントの中でより多くの情報を私たちに指摘してください。

Ubuntu LinuxでHadoopを実行するPythonでHadoop MapReduceプログラムを書く

シェア

コメントを残します