Hadoopで動かしてみましょう
それではこれらのMap, Reduceを実際にHadoopで動作させてみます。Hadoopではstreamingユーティリティがjarで用意されていますので,
$ hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-0.20.2-streaming.jar ¥…① -input 2ch_4.txt ¥…② -output 2ch_4_result ¥…③ -mapper /path/to/J2chMap.pl ¥…④ -reducer /path/to/J2chRed.pl ¥…⑤ -inputformat TextInputFormat …⑥
- ①jarファイルの指定。streaming用のjarが用意されていますのでそれを指定します。
- ②入力ファイルの指定。ここではHDFS上のファイルを指定します。
- ③出力ディレクトリの指定。ここではHDFS上のディレクトリを指定します。すでに存在すると動かないので,
以下のように事前に削除しておく必要があります。
$ hadoop dfs -rmr 2ch_4_result
- ④mapperプログラムの指定。先ほど作成したJ2chMap.
plを指定します。これは全てのサーバから参照されるパスにないといけません。今回はnfsで共有しているのでコピー等の必要はありません (-fileオプションを使用するとHDFS経由でプログラムを転送してくれるようです)。 - ⑤reduceプログラムの指定。J2chRed.
plを指定します。mapperと同じく全てのノードサーバから参照できる必要があります。 - ⑥入力フォーマットの指定。テキストフォーマットを指定します。他にはXMLやバイナリといったフォーマットを指定できます。
実行時の出力は以下のようになります。
10/11/08 23:27:18 INFO mapred.FileInputFormat: Total input paths to process : 1 10/11/08 23:27:19 INFO streaming.StreamJob: getLocalDirs(): [/usr/local/hdfs/h/mapred/local] 10/11/08 23:27:19 INFO streaming.StreamJob: Running job: job_201011072308_0012 10/11/08 23:27:19 INFO streaming.StreamJob: To kill this job, run: 10/11/08 23:27:19 INFO streaming.StreamJob: /usr/local/apache_proj/hadoop/bin/../bin/hadoop job -Dmapred.job.tracker=hadoop1:9001 -kill job_201011072308_0012 10/11/08 23:27:19 INFO streaming.StreamJob: Tracking URL: http://hadoop1:50030/jobdetails.jsp?jobid=job_201011072308_0012 10/11/08 23:27:20 INFO streaming.StreamJob: map 0% reduce 0% 10/11/08 23:27:33 INFO streaming.StreamJob: map 3% reduce 0% 10/11/08 23:27:36 INFO streaming.StreamJob: map 10% reduce 0% 10/11/08 23:27:39 INFO streaming.StreamJob: map 20% reduce 0% 《中略》 10/11/08 23:29:27 INFO streaming.StreamJob: map 100% reduce 32% 10/11/08 23:29:31 INFO streaming.StreamJob: map 100% reduce 49% 10/11/08 23:29:33 INFO streaming.StreamJob: map 100% reduce 83% 10/11/08 23:29:34 INFO streaming.StreamJob: map 100% reduce 100% 10/11/08 23:29:37 INFO streaming.StreamJob: Job complete: job_201011072308_0012 10/11/08 23:29:37 INFO streaming.StreamJob: Output: 2ch_4_result $
管理画面では進捗状況が図2のように見えます。
mapタスクが20分割され並列で処理されました。reduceタスクは4つに分割され処理されています。
結果の取得
結果はHDFS上に保存されますので,
$ hadoop dfs -getmerge 2ch_4_result 2ch_4_result.txt
-getmergeコマンドを使用することで,
さてファイルの中身は?
《略》
1287150000 93,土下座
1287150000 67,焼き
1287150000 47,゚
1287150000 31,カイジ
1287150000 31,利根川
1287139800 2,そう
1287139800 2,オッケイ
1287139800 2,羽鳥
1287139800 2,足
1287139800 2,今日
1287142800 4,借金
1287142800 4,侍
1287142800 2,ウイルス
1287142800 2,自由
1287142800 2,大丈夫
1287144600 242,゚
1287144600 154,これ
1287144600 154,ざわ
1287144600 119,利根川
1287144600 110,∀
1287146400 112,映画
1287146400 98,これ
1287146400 89,カット
1287146400 64,人
1287146400 63,原作
1287148200 230,ざわざわ
1287148200 114,ざわ
1287148200 105,カイジ
1287148200 88,これ
1287148200 85,利根川
1287151200 152,/
1287151200 102,.
1287151200 59,映画
1287151200 54,-
1287151200 47,カイジ
1287138000 4,ヤバ
1287138000 3,宣伝
《略》
なんとなくそれっぽいのが出ていますね。が,
これはReducerが4つになった影響で,
ストリーミングを使用することで,
それでは次回はまとめになります。