だから何かを片付けるために:
Mahout の XMLInputFormat は、XML ファイルを処理し、構成された 2 つの開始タグと終了タグの間の XML を抽出します。したがって、XML が次のようになっているとします。
<main>
<person>
<name>Bob</name>
<dob>1970/01/01</dob>
</person>
</main>
開始タグと終了タグを<person>
andに設定すると</person>
、マッパーは次の<LongWritable, Text>
ペアを map メソッドに渡します。
LongWritable: 10
Text: "<person>\n <name>Bob</name>\n <dob>1970/01/01</dob>\n </person>"
マッパーでこのデータをどうするかは、あなた次第です。
分割に関してはXmlInputFormat
extendsTextInputFormat
であるため、入力ファイルが分割可能な場合 (つまり、圧縮されていないか、snappy などの分割可能なコーデックで圧縮されている場合)、ファイルは次のように 1 つ以上のマッパーによって処理されます。
- 入力ファイル サイズ (たとえば 48 MB) が HDFS の 1 ブロック (たとえば 64 MB) よりも小さく、最小/最大分割サイズ プロパティを構成しない場合、ファイルを処理する単一のマッパーが取得されます。
- 上記と同様ですが、最大分割サイズを 10MB に設定すると (
mapred.max.split.size=10485760
)、ファイルを処理するための 5 つのマップ タスクが取得されます。
- ファイルがブロック サイズよりも大きい場合は、各ブロックのマップ タスクを取得します。最大分割サイズが設定されている場合は、その分割サイズによるファイル分割の各部分のマップを取得します。
ファイルがこれらのブロックまたは分割サイズのチャンクに分割されると、XmlInputFormat はブロック/分割境界のバイト アドレス/オフセットを探し、構成された XML 開始タグが見つかるかブロックのバイト アドレスに到達するまで順方向にスキャンします。 /分割境界。開始タグが見つかると、終了タグ (またはファイルの終わり) が見つかるまでデータを消費します。終了タグが見つかった場合、レコードがマッパーに渡されます。そうでない場合、マッパーは入力を受け取りません。強調するために、マップは終了タグを見つけようとするときにブロック/分割の終わりを越えてスキャンする場合がありますが、開始タグが見つかった場合にのみこれを行い、それ以外の場合はブロック/分割の終わりでスキャンが停止します。
したがって、(最終的に)質問に答えるために、マッパーを構成していない場合(そしてデフォルトまたは識別マッパーを使用している場合)、はい、XMLチャンクがどれだけ大きいかは関係ありません(MB、GB 、TB の!) レデューサーに送信されます。
これが理にかなっていることを願っています。
編集
あなたのコメントをフォローアップするには:
- はい、各マッパーはファイルの分割 (バイトの範囲) を処理しようとします。
- はい、最大分割サイズの設定に関係なく、マッパーは開始タグと終了タグの間 (両端を含む) のデータを表すレコードを受け取ります。person 要素は、そのサイズに関係なく分割されません (明らかに、開始要素と終了要素の間に GB のデータがある場合、Text オブジェクトにバッファリングしようとしてメモリが不足する可能性があります)。
- 上記から続けて、データが start 要素と end 要素の間で分割されることは決してなく、 person 要素はその全体がマッパーに送信されるため、SAX パーサーなどを使用して、恐れることなくさらに処理することは常に問題ありません。 person 要素の一部しか表示されていません。