Hadoopメモ

この前やってて出てきた疑問を、id:mamorukさんに聞いて解決。ありがとうございました。

Mapperの数を指定できなかった件

指定はできるようだ。ただ、オプションに一貫性がないような。。。"-D"の場所を変えると動かなかったり。Mapperの数は指定はできるけど、この数でforceされるわけではないことに注意が必要。

yasuhisa-y@cacao:/work/yasuhisa-y$ hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-*-streaming.jar -D mapred.map.tasks=100 -input /nldata/jawiki -output word_count_file -numReduceTasks 100 -file "maper.rb" -mapper "maper.rb" -file "reducer.rb" -reducer "reducer.rb" 

\C-cしたら殺せ

\C-cしてもJobが詰まったままらしく

hadoop job -kill job-id

とやって明示的に殺さないといけない。

hadoop job -list

で調べられる。知らないで詰まらせててごめんなさい。。。

IterationごとにMap Reduceするようなアルゴリズムについて

例えばEMアルゴリズムとか。一回Reduceしたら、それが次のMapのときの入力となる。Javaで書く時にはなんの問題もないが、Hadoop Streamingを使うような場合だと困る。どういう風にやるのがいいかid:mamorukさんに聞いたところ、outputのディレクトリにsuffixを付けるのが普通なのではないか、ということだった。アルゴリズム中に何回もMap ReduceするようなものはStreamingでやるとかえって面倒なので、その付近は大人しくJavaを使いましょうということか。さらなる詳細はテキストを参照してください(後のChapter)。

Map => Reduceしてもう一回Map Reduce

Word Countのプログラム、(wikipediaクラスの量でも)Reducerが一個だと結構遅いので、Reducerの数を増やすことになると思う。しかし、Reducerの数を100個とかにするとそれをまたまとめないといけない。Rubyとかでやろうと思うと

  • 任意の2個のファイルを持ってきて、(sort済みである性質を使って)先頭から見ていってファイルをmergeしていく

を100個に関してやっていけばよい(foldrっぽく)。

しかし、これだとMap Reduce使ってるのに意味ない!!ということでどうしようかと思っていたんだけど、もう一回Map Reduceやるのが常套手段らしい。これだとMap Reduceの御利益を受けられる。