64MBに切り分けられたブロック境界の扱われ方

まだ実装面まで踏み込んでる訳じゃないので、あくまで俺メモ。参考にはならない。

HDFSでは大きなファイルを細かく刻んで色んなノードに保存している。当然データの切れ目は勝手に決められるのでその辺はどうしようもない。ここで、ある馬鹿でかいテキストファイルの行数をMapReduceで数える事を考える。

conf.setInputFormat(TextInputFormat.class);

こうすると入力を一行単位でMapperに渡してくれるので、WordCountをちょこっといじくって

public void map(略) {
    output.collect(new Text("Lines"), one);
}

こうしてあげれば簡単に行数を数える事ができる。しかし、ある行が丁度ブロックの境界をまたいでいたらどうなるんだろう、という余計な心配が発生します。もし実行中のノードに、現在処理しているブロックの後続ブロックが無ければネットワーク越しにファイルの続きを持ってくる必要があると思うんだけど、そう言う処理はしてるのかと。さすがにそんなところで…っていう感じだけど、心配だったので確認してみただけ。

で、各行の長さをランダムに決めた約1GBのテキストファイルをHDFSにコピーして行数を数えてみたところ、問題無く数えられた。素晴らしす。当然なんだろうけどカコヨイ!あとは、実際にソースを読んでどういう風に処理をしているのかを調べてみる必要があり。