以下で確認したいだけです。これが正しいかどうかを確認してください。1。ファイルをHDFSにコピーするときの私の理解によると、ファイル(サイズ> 64MB = HDFSブロックサイズを想定)が複数のチャンクに分割され、各チャンクが異なるチャンクに保存されるポイントです。データノード。
ファイルがHDFSにコピーされると、ファイルの内容はすでにチャンクに分割されており、マップジョブの実行時にそのファイル分割は発生しません。マップタスクは、最大の各チャンクで機能するようにのみスケジュールされます。サイズ64MB、データの局所性(つまり、マップタスクはデータ/チャンクを含むノードで実行されます)
ファイルの分割は、ファイルが圧縮(gzip圧縮)されている場合にも発生しますが、MRは、各ファイルが1つのマッパーによって処理されることを保証します。つまり、MRは、他のデータノードにあるgzipファイルのすべてのチャンクを収集し、それらすべてを単一のマッパーに渡します。
IsSplitable()を定義してfalseを返す場合、上記と同じことが起こります。つまり、ファイルのすべてのチャンクは、1台のマシンで実行されている1つのマッパーによって処理されます。 MRは、さまざまなデータノードからファイルのすべてのチャンクを読み取り、単一のマッパーで使用できるようにします。
あなたの理解は理想的ではありません。ファイルをHDFSブロックに分割するプロセスと、異なるマッパーで処理するためにファイルを分割するプロセスの2つがほぼ独立していることを指摘しておきます。
HDFSは、定義されたブロックサイズに基づいてファイルをブロックに分割します。
各入力形式には、さまざまなマッパーによる独立した処理のためにファイルを部分に分割する方法に独自のロジックがあります。 FileInputFormatのデフォルトロジックは、HDFSブロックごとにファイルを分割することです。他のロジックを実装できます
圧縮は通常、分割の敵であるため、圧縮データの分割を可能にするためにブロック圧縮技術を採用しています。これは、ファイル(ブロック)の各論理部分が個別に圧縮されることを意味します。
デビッドの答えはほとんど頭に釘を打っています、私はここでそれについて詳しく説明しています。
ここでは2つの異なる概念が機能しており、各概念はHadoopフレームワークの異なるエンティティによって処理されます。
まず-
1)ファイルをブロックに分割する-ファイルがHDFSに書き込まれると、HDFSはファイルをブロックに分割し、その複製を処理します。これは(ほとんど)一度実行され、その後、クラスターで実行されているすべてのMRジョブで使用できます。これはクラスター全体の構成です
第二に-
2)ファイルを入力分割に分割する-入力パスがMRジョブに渡されると、MRジョブは、入力パスで指定されたファイルを分割に分割するように構成された入力形式とともにパスを使用します。 、各分割はマップタスクによって処理されます。入力分割の計算は、ジョブが実行されるたびに入力形式によって行われます。
これを理解すると、isSplitable()メソッドが2番目のカテゴリに分類されることがわかります。
これを実際に突き止めるには、HDFS書き込みデータフローを見てください(コンセプト1)
図の2番目のポイントは、おそらく分割が発生する場所です。これはMRジョブの実行とは関係がないことに注意してください。
ここで、MRジョブの実行手順を見てみましょう。
ここでの最初のステップは、ジョブ用に構成されたinputformatを介した入力分割の計算です。
あなたの混乱の多くは、あなたがこれらの概念の両方をクラブしているという事実から生じています、私はこれがそれをもう少し明確にすることを願っています。
はい、ファイルがHDFSにコピーされると、ファイルの内容はチャンクに分割されます。ブロックサイズは構成可能であり、たとえば128 MBの場合、128 MB全体が1ブロックになり、64 MBの2ブロックを個別に保存する必要はありません。また、ファイルの各チャンクを個別のデータノードに保存する必要はありません。データノードには、特定のファイルの複数のチャンクが含まれる場合があります。また、レプリケーションファクターに基づいて、特定のチャンクが複数のデータノードに存在する場合があります。