R&Dトレンドレポート

第11回 MapReduce処理をやってみよう![実践編2]

この記事を読むのに必要な時間:およそ 5 分

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のように見えます。

図2

図2

mapタスクが20分割され並列で処理されました。reduceタスクは4つに分割され処理されています。

結果の取得

結果はHDFS上に保存されますので,コマンドで取得します。

$ hadoop dfs -getmerge 2ch_4_result 2ch_4_result.txt

-getmergeコマンドを使用することで,複数のファイルに分かれた結果が1つのファイルにマージされてダウンロードされます。

さてファイルの中身は?

《略》

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つになった影響で,それぞれのReducerないではキー順でのソートが行われていますが,全体に対してのソートが行われないためです。そのため,今回の出力も4つのブロックに分かれています。しかし,最終的にこのデータをDBに入れたりすることを考えるとそれほど問題ではありません。

ストリーミングを使用することで,簡単にHadoopを使用できることがわかったと思います。PerlやRubyといった手慣れた言語でさっさと書けるのが魅力ですね。

それでは次回はまとめになります。

著者プロフィール

脇本武士(わきもとたけし)

都内中小IT企業(メイサンソフト(株))に所属。某大手自動車会社でのシステム開発,運用を経て,現在は研究開発部署に席をお借りしています。DB周りの保守サポート,ウェブ技術開発を主に手がけてきました。現在は大規模計算フレームワークの活用とKVSに注目しています。普段はOS Xを使用していますが一番よく使うアプリはTerminalです(笑)。

R&Dトレンドレポート(てくらぼ)