HDFS は、ファイルをブロックに分割する際に新しい行を考慮しないため、1 行が 2 つのブロックに分割される可能性があります。ただし、MapReduce は行うため、入力ファイル内の行は単一のマッパーによって処理されます。
2012-10-20 00:05:00; BEGIN
...
SQL エラー -678: エラー メッセージ
...
2012-10-20 00:47:20; 終わり
ファイルがブロック サイズよりも大きい場合、上記の行が 2 つのブロックに分かれ、異なるマッパーによって処理される可能性が高くなります。FileInputFormat.isSplitable()を上書きして、1 つのログ ファイルが 1 つのマッパーによって処理され、複数のマッパーによって処理されないようにすることができます。
Hadoop は、KV ペアを使用してユーザー定義のマップ関数を呼び出します。ここで、K はファイル オフセットで、値は入力ファイルの行です。BEGIN 時刻を格納して、後でユーザー定義の map 関数を呼び出したときに END 時刻と照合するために、インスタンス変数が必要になります。
単一のマッパーが特定のマップ ファイルを処理し、分散されていないため、これは効率的な方法ではありません。
もう 1 つの方法は、関連する行を 1 行にまとめて、ログ ファイルを前処理することです。このように、ログ ファイル内の関連する行は、1 つのマッパーのみによって処理されます。
参考までに、 FileInputFormat.isSplitable() を使用しないより複雑なアプローチも可能ですが、解決する必要があります。
各アプローチの長所と短所を評価し、正しいものを選択する必要があります。