Hadoopの分割サイズとブロックサイズの関係は何ですか? this で読んだように、分割サイズはブロックサイズのn倍でなければなりません(nは整数で、n> 0)、これは正しいですか?分割サイズとブロックサイズの間に関係がありますか?
HDFSアーキテクチャには、ブロックの概念があります。 HDFSで使用される一般的なブロックサイズは64 MBです。大きなファイルをHDFSに配置すると、64 MBのチャンクに分割されます(ブロックのデフォルト構成に基づいて)、1GBのファイルがあり、そのファイルをHDFSに配置すると仮定すると、1GB/64MB = 16になります分割/ブロックとこれらのブロックは、DataNode全体に分散されます。これらのブロック/チャンクは、クラスター構成に基づいて異なる異なるDataNodeに存在します。
データの分割は、ファイルオフセットに基づいて行われます。ファイルを分割して異なるブロックに保存する目的は、データの並列処理とフェイルオーバーです。
ブロックサイズと分割サイズの違い。
分割は、データの論理的な分割であり、基本的にMap/ReduceプログラムまたはHadoopエコシステムでの他のデータ処理技術を使用したデータ処理中に使用されます。分割サイズはユーザー定義の値であり、データの量(処理するデータの量)に基づいて独自の分割サイズを選択できます。
スプリットは、基本的にMap/Reduceプログラムでマッパーの数を制御するために使用されます。 Map/Reduceプログラムで入力分割サイズを定義していない場合、デフォルトのHDFSブロック分割は入力分割と見なされます。
例:
100MBのファイルがあり、HDFSのデフォルトのブロック構成が64MBである場合、2つのブロックに分割され、2つのブロックを占有します。このデータを処理するMap/Reduceプログラムがありますが、入力分割を指定していない場合、ブロック数に基づいて(2ブロック)入力分割がMap/Reduce処理のために考慮され、2マッパーがこのために割り当てられますジョブ。
ただし、Map/Reduceプログラムで分割サイズ(100MBなど)を指定した場合、両方のブロック(2ブロック)がMap/Reduce処理の単一の分割と見なされ、1つのMapperがこのジョブに割り当てられます。
Map/Reduceプログラムで分割サイズ(25MBなど)を指定した場合、Map/Reduceプログラムには4つの入力分割があり、4つのMapperがジョブに割り当てられるとします。
結論:
マッパーをBlock 1で実行する場合、マッパーは2番目のレコード全体を持たないため処理できません。
これは、入力分割が解決する正確な問題です。 入力分割は論理レコードの境界を尊重します。
input splitサイズを200MBと仮定しましょう
したがって、入力スプリット1はレコード1とレコード2の両方を持つ必要があります。また、レコード2が割り当てられているため、入力スプリット2はレコード2で始まりません。入力スプリット1へ。入力スプリット2はレコード3から始まります。
これが、入力分割がデータの論理チャンクのみである理由です。ブロックの開始位置と終了位置を指します。
入力分割サイズがブロックサイズのn倍の場合、入力分割は複数のブロックに適合する可能性があるため、ジョブ全体に必要なMappersの数が少なくなるため、より少ない並列性。 (マッパーの数は入力分割の数です)
入力分割サイズ=ブロックサイズが理想的な構成です。
お役に立てれば。
Splitの作成は、使用されているInputFormatに依存します。以下の図は、FileInputFormatのgetSplits()メソッドが2つの異なるファイルの分割を決定する方法を説明しています。
Split Slope(1.1)の役割に注意してください。
対応するJava分割を行うソースは次のとおりです。
上記のメソッドcomputeSplitSize()は、Max(minSize、min(maxSize、blockSize)に展開されます)、最小/最大サイズはmapreduce.input.fileinputformat.split.minsize/maxsizeを設定することで構成できます