fz-qqq's diary

テキストマイニング、機械学習など

Hadoop Streaming で手軽に Map Reduce する

研究で Hadoop Streaming を利用して負荷分散をしていますが、それなりに躓いた点もあったので、備忘録がてら簡単にまとめておきたいと思います。ちなみに、Map Reduce って何?って人はYahoo! Japan のブログ http://techblog.yahoo.co.jp/architecture/hadoop/Hadoop Streamingって何?って人は、こちらの方のブログ http://blog.liris.org/2009/05/hadooppythonno.html がとてもわかりやすくまとめてくれています。

なぜPythonでもRubyでも動くのか

Hadoop Streamingを使えば、PythonRubyなど、自分の好きな言語でMap Reduceのプログラムを書くことができます。内部ではJavaで実装されたMapper・Reducerが、UNIXコマンド "./mapper.py" を実行し、その結果をMapper・Reducerの出力として扱ってくれているためです。そのため、一行目には必ず "#!/usr/bin/python" といった、実行コマンドのフルパスを記述しておいてあげなければちゃんと動いてくれません。

Hadoop Streaming実行の主なコマンドオプション

オプション 説明
-mapper path/to/mapper mapperの絶対パス
-reducer path/to/reducer reducerの絶対パス
-combiner path/to/combiner combinerの絶対パス
-file path/to/file mapper、reducer、combinerの絶対パスと、各プログラム中で呼び出す必要のある外部ファイルの絶対パス
-D mapred.job.name="jobname" ブラウザ上で表示する際のJobの名前
-D mapred.map.tasks=30 mapperのタスク数の指定
-D mapred.reduce.tasks=30 reducerのタスク数の指定
-D mapred.job.priority=HIGH jobのpriorityの設定

よく利用するHadoopコマンド

コマンド 説明
hadoop fs -put ローカルファイル名 HDFS上でのファイル名 HDFS上にファイルをアップロード
hadoop fs -ls HDFS上のファイルを確認
hadoop fs -rmr HDFS上のファイルを削除
hadoop fs -get HDFS上のファイルをダウンロード
hadoop fs -cat HDFS上のファイルをcat

とりあえず実行してみる

とりあえず動いているところを試したければ、こちらに辞書中の単語に関してword countを行うプログラムを掲載しているので、git cloneしてHadoopの動く環境のあるサーバへ置いて下さい。下に同じプログラムを掲載しています。
HDFS上で実行する前に、プログラムが正しいかどうか確認する際は、以下のコマンドで確認できます。

cat sample.txt | ./mapper.py | ./reducer.py

小さいファイルで動くことを試せたら、自分のファイルをHDFS上へ上げてみましょう。
hadoop fs -put (ローカルのファイル名) (HDFS上でのファイル名)
実行のシェルスクリプトを自分の環境用に変更しましょう。変更点は以下の三点です。

hadoop_in=" ** path-to-hdfs-file ** "
hadoop_out=" ** path-to-hdfs-file ** "
options=$options" -file ** path-to-dic.json **"

ちなみに path-to-dic.jsonはローカル上の絶対パスなので、例えば/home/username/wordcount_streaming/dic.jsonなどになります。
辞書データなどを使わない場合はこの項目を消して下さい。
あとはsh run.shで実行すればプログラムが動作するはずです。
プログラムが終了したら、以下のコマンドで実行結果を確認しましょう。

hadoop fs -cat (hadoop_outのファイル名)/p* | less


Hadoop Streaming を利用した word count

Hadoop 第3版

Hadoop 第3版