ハイレベルでは、Hadoop NameNodeは、HDFSに格納されている 'ファイル'を構成するブロックがある場所のトラッカーと考えることができます。ブロックは、HDFSクラスタに格納されたときに大きなファイルを小さな断片に分割するために使用されます。
HDFSにたくさんの小さなファイルが保存されている場合、ブロックがたくさんあり、NameNodeはメモリ内のすべてのファイルとブロックを追跡する必要があります。
大きなファイルがある場合、たとえば、これらのファイルをすべて大きなファイルにまとめると、最初にHDFSに格納されるファイルの数が少なくなり、ブロック数も少なくなります。
まず者は、ファイルサイズ、HDFSのブロック、および名前ノードのメモリがどのように関連するかについて議論しましょう:
これは例や数字で見ることが容易です。
この例のHDFS NameNodeのblock size
は100 MBです。
1MBのファイルが1,000個あり、HDFSに保存しておきましょう。これら1,000個の1 MBファイルをHDFSに保存すると、HDFSクラスタ内にこれらのファイルを構成するブロックが1,000個もあります。
- HDFSに格納された各ブロック1000個の1メガバイトのファイルを表すもの千個のブロックのメモリの約150キロバイトである、名前ノードのメモリの約150バイトを必要とします。
これら1,000個の1 MBファイルを1つの1,000 MBファイルに統合または連結し、その単一ファイルをHDFSに保存することを検討してください。 1,000 MBのファイルをHDFSに保存すると、HDFSのクラスタブロックサイズに基づいてブロックに分割されます。この例では、ブロックサイズは100 MBでした。これは、1,000 MBのファイルがHDFSクラスタに10 MBのブロックとして格納されることを意味します。
- HDFSに格納された各ブロックには約150バイトのNameNodeメモリが必要です。これは1,000 MBのファイルを表す10ブロックの約1.5 KBのメモリです。
大きなファイルでは、同じデータがHDFSクラスタに保存されますが、小さなファイルが多い状況に比べてNameNodeメモリの1%が使用されます。
ジョブの入力ブロックとマップタスクの数は関連しています。
Map
タスクの場合、入力ブロックごとに通常1マップのタスクがあります。ここでの入力ブロックのサイズは重要です。なぜなら、新しいタスクの開始と終了によるオーバーヘッドがあるからです。すなわち、Mapタスクの処理が速すぎると、このオーバーヘッドの量が各タスクの完了時間の大部分になり、ジョブ全体が完了すると、同じジョブよりも遅くなりますが、入力ブロックは少なくなります。 MapReduce2ベースのジョブの場合、マップタスクには、リソース管理レイヤーでYARNコンテナーの開始と停止がタスクごとに行われ、オーバーヘッドが増加します。 (これらの非効率性のいくつかに対処するために、多くの小さな入力ブロックを処理する場合は、最小入力サイズのしきい値を使用するようMapReduceジョブに指示することもできます)