2

私は Hadoop MapReduce を初めて使用し (正確には 4 日)、クラスターで分散 XML 解析を実行するように依頼されました。インターネットでの (再) 検索によると、Mahout の XmlInputFormat を使用するのはかなり簡単なはずですが、私の仕事は、システムが巨大な (~5TB) XML ファイルに対して機能することを確認することです。

私の知る限り、マッパーに送信されるファイル分割は、hdfs ブロック サイズ (またはジョブごとのブロック サイズ) よりも大きくすることはできません。【間違っていたらごめんなさい】。

私が直面している問題は、一部の XML 要素が大きい (~200MB) ものと小さい (~1MB) ことです。

私の質問は次のとおりです。XmlInputFormat によって作成された XML 要素のチャンクがブロック サイズよりも大きい場合はどうなりますか? 大きなファイル全体 (たとえば 200MB) をマッパーに送信するか、要素を 3 つの分割 (64+64+64+8) で送信しますか?

私は現在、会社の Hadoop クラスターにアクセスできない (そしていつかアクセスできない) ため、テストを実行して調べることができません。親切に私を助けてください。

4

1 に答える 1

6

だから何かを片付けるために:

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>"

マッパーでこのデータをどうするかは、あなた次第です。

分割に関してはXmlInputFormatextendsTextInputFormatであるため、入力ファイルが分割可能な場合 (つまり、圧縮されていないか、snappy などの分割可能なコーデックで圧縮されている場合)、ファイルは次のように 1 つ以上のマッパーによって処理されます。

  1. 入力ファイル サイズ (たとえば 48 MB) が HDFS の 1 ブロック (たとえば 64 MB) よりも小さく、最小/最大分割サイズ プロパティを構成しない場合、ファイルを処理する単一のマッパーが取得されます。
  2. 上記と同様ですが、最大分割サイズを 10MB に設定すると ( mapred.max.split.size=10485760)、ファイルを処理するための 5 つのマップ タスクが取得されます。
  3. ファイルがブロック サイズよりも大きい場合は、各ブロックのマップ タスクを取得します。最大分割サイズが設定されている場合は、その分割サイズによるファイル分割の各部分のマップを取得します。

ファイルがこれらのブロックまたは分割サイズのチャンクに分割されると、XmlInputFormat はブロック/分割境界のバイト アドレス/オフセットを探し、構成された XML 開始タグが見つかるかブロックのバイト アドレスに到達するまで順方向にスキャンします。 /分割境界。開始タグが見つかると、終了タグ (またはファイルの終わり) が見つかるまでデータを消費します。終了タグが見つかった場合、レコードがマッパーに渡されます。そうでない場合、マッパーは入力を受け取りません。強調するために、マップは終了タグを見つけようとするときにブロック/分割の終わりを越えてスキャンする場合がありますが、開始タグが見つかった場合にのみこれを行い、それ以外の場合はブロック/分割の終わりでスキャンが停止します。

したがって、(最終的に)質問に答えるために、マッパーを構成していない場合(そしてデフォルトまたは識別マッパーを使用している場合)、はい、XMLチャンクがどれだけ大きいかは関係ありません(MB、GB 、TB の!) レデューサーに送信されます。

これが理にかなっていることを願っています。

編集

あなたのコメントをフォローアップするには:

  1. はい、各マッパーはファイルの分割 (バイトの範囲) を処理しようとします。
  2. はい、最大分割サイズの設定に関係なく、マッパーは開始タグと終了タグの間 (両端を含む) のデータを表すレコードを受け取ります。person 要素は、そのサイズに関係なく分割されません (明らかに、開始要素と終了要素の間に GB のデータがある場合、Text オブジェクトにバッファリングしようとしてメモリが不足する可能性があります)。
  3. 上記から続けて、データが start 要素と end 要素の間で分割されることは決してなく、 person 要素はその全体がマッパーに送信されるため、SAX パーサーなどを使用して、恐れることなくさらに処理することは常に問題ありません。 person 要素の一部しか表示されていません。
于 2012-10-02T01:20:12.970 に答える