すでに前回のプレゼン資料などでもチラッと触れているので目新しい情報は無いのだけど Hadoop Streaming でジョブを次々と連結させて何かをしたいときのノウハウまとめ。
ジョブの正常終了を確認する
出力ディレクトリに _SUCCESS が作成されるはずなのでその有無を確認すれば良い。
hadoop fs -get $HDFS_OUT/_SUCCESS>>$JOBLOG 2>&1
test -f _SUCCESS && 成功時処理
test -f _SUCCESS && 成功時処理
先行ジョブの出力結果を後続ジョブに渡す
単純に先行ジョブの出力結果を -input で読み取れば良い。ジョブの先行後続関係はシェルスクリプトで直列で並べれば定義できる。
job1/bin/run>>job1/log/job.log 2>&1
job2/bin/run>>job2/log/job.log 2>&1
job2/bin/run>>job2/log/job.log 2>&1
他のジョブの結果を利用する
外部ファイルとして読み込む方法がここやここで紹介されている。巨大なファイルを外から持ってくるのは効率が良くないけど、何かの分布表とかのように判断の基準となるデータが含まれたファイルを読み込むのには使えそう。
基本的に -file オプションを利用して以下のように読み込む。
-file job3/log/result.log
あとは普通にコードからオープンすれば良い。
@external_file = "result.log"
def read_from_external
open(@external_file) do |file|
file.each do |line|
@external << line
end
end
end
def read_from_external
open(@external_file) do |file|
file.each do |line|
@external << line
end
end
end
メモリに載せるとすごいサイズになるような巨大なファイルに対しこういう使い方をしてはいけない。小さいファイルならメモリに載せたほうが処理がラクだろう。