入力分割は、データへの論理参照です。APIを見ると、レコードの境界について何も認識していないことがわかります。入力分割ごとにマッパーが起動されます。すべてのレコードに対してマッパーmap()
が実行されます (WordCount プログラムでは、ファイル内のすべての行)。
しかし、マッパーはどのようにしてレコード境界がどこにあるかを知るのでしょうか?
これは、Hadoop MapReduce InputFormat Interface からの引用の出番です -
アプリケーションは、レコード境界を尊重し、論理的な InputSplit のレコード指向のビューを個々のタスクに提示する責任がある RecordReader も実装する必要があります。
すべてのマッパーは InputFormat に関連付けられています。それInputFormat
には、使用する情報がありRecordReader
ます。APIを見ると、入力分割と使用するレコード リーダーを認識していることがわかります。入力分割とレコードリーダーについてさらに知りたい場合は、この回答を読む必要があります。
ARecordReader
は、レコード境界が何であるかを定義します。はInputFormat
、何RecordReader
を使用するかを定義します。
WordCount プログラムは any を指定しないInputFormat
ため、デフォルトでTextInputFormat
which がLineRecordReaderを使用し、すべての行を異なるレコードとして出力します。そして、これはあなたのソースコードです
レコードの境界を尊重する必要があるため、input-size に基づく [L]logical 分割は多くのアプリケーションにとって不十分です。
これが意味することは、次のようなサンプルファイルの場合
a b c d e
f g h i j
k l m n o
そして、すべての行をレコードにしたいと考えています。論理分割が入力サイズに基づいている場合、次のような 2 つの分割が存在する可能性があります。
a b c d e
f g
と
h i j
k l m n 0
がなければ、 と は別のレコードであると見なされRecordReader
ていたでしょう。明らかに、これはほとんどのアプリケーションが望んでいるものではありません。f g
h i j
あなたの質問に答えると、WordCount プログラムでは、レコード境界が何であるかは問題ではありませんが、同じ単語が異なる論理分割に分割される可能性があります。したがって、サイズに基づく論理分割は、WordCount プログラムには十分ではありません。
すべての MapReduce プログラムは、レコードの境界を「尊重」します。そうでなければ、あまり役に立ちません。