特定のファイルのブロックがどのデータノードにあるかを知っている単一の名前ノードがあります。
HDFSのファイルサイズが1024 MBで、サイズが8ブロック128 MBに分割されているとします。それらのブロックが8つの異なるノードに都合よく配布されているとしましょう。
クライアントがファイルをダウンロードする必要がある場合、クライアントはファイルの名前を要求します。 namenodeがファイル自体を返すことを望むならば、最初にすべてのデータノードからファイルをダウンロードしてから、それを1つずつクライアントに返さなければなりません。 namenodeはすべてのクライアントに単独でサービスを提供し、中間データを格納して提供するためにmemory/cpuを無駄にしなければならないため、これは大いに非効率的です。 2つのクライアントが同じファイルを同時に要求した場合、namenodeはクライアントに合計16ブロックを提供する必要があります。
あなたのクライアントが各マシンから1ブロックを直接ダウンロードした場合は、効率的です。そうすれば、同じファイルを要求しているクライアントが2人いると、各データノードは2ブロック同時に処理するだけです。
hadoopインストールに付属し、hdfs dfs -<cmd>
またはhadoop fs -<cmd>
で呼び出し可能なFSシェルなどのHDFSクライアントを使用する場合、クライアントはデフォルトでポート9000のファイルのnamenodeを要求します。 namenodeは、異なるデータノード上の異なるブロックのURIを返します。クライアントは、通常、ポート50010のデータ転送ポートにある別のデータノードからブロックをダウンロードできます。
FSシェルを使用してファイルをダウンロードし、クライアントマシン上のネットワークを監視すると、異なるデータノードから直接ブロックをダウンロードすることがわかります。次に、4ブロックのファイルをダウンロードし、tcptrack
ツールを使用してネットワークを監視する例を示します。
これは、ワークロードを分散、名前ノードを軽減し、また、複数のdatanodesからのブロックの同時ダウンロードをするために、クライアントを可能にします。スクリーンショットでは、2つの接続がアクティブで、1つの接続が3つの異なるIPアドレス(データノード)からクローズしていることが分かります。
すべてのダウンロードが完了すると、クライアントはすべてのブロックを連結してフルファイルを取得します。