最初に、SequenceFileが解決しようとしている問題を理解し、次にSequenceFileが問題の解決にどのように役立つかを理解する必要があります。
HDFSの場合
- SequenceFileは、Hadoopの小さなファイルの問題に対するソリューションの1つです。
- 小さなファイルは、HDFSブロックサイズ(128MB)よりも大幅に小さくなります。
- HDFSの各ファイル、ディレクトリ、ブロックはオブジェクトとして表され、150バイトを占有します。
- 1000万ファイルは、NameNodeの約3ギガバイトのメモリを使用します。
- 10億のファイルは実現不可能です。
MapReduce内
小さなファイルのシナリオ
- ファイルは、より大きな論理ファイルの一部です。
- ファイルは、たとえば画像など、本質的に小さいものです。
これらの2つのケースでは異なるソリューションが必要です。
- まず、小さなファイルを連結するプログラムを作成します(これを正確に実行するConsolidatorと呼ばれるツールについてNathan Marzの post を参照してください)。
- 2番目の方法では、ファイルを何らかの方法でグループ化するために、ある種のコンテナーが必要です。
Hadoopのソリューション
HARファイル
- HAR( Hadoop Archives )は、ネームノードのメモリに圧力をかける多くのファイルの問題を軽減するために導入されました。
- HARはおそらく、アーカイブ目的でのみ使用するのが最善です。
SequenceFile
- SequenceFileの概念は、各小さなファイルを1つの大きなファイルに配置することです。
たとえば、100KBのファイルが10,000個あるとすると、以下のように、それらを単一のSequenceFileに入れるプログラムを記述できます。ここで、ファイル名をキーに使用し、コンテンツを値に使用できます。
(ソース: csdn.net )
いくつかの利点:
- NameNodeで必要なメモリの数が少なくなります。 10,000個の100KBファイルの例を続けます。
- SequenceFileを使用する前は、10,000個のオブジェクトがNameNodeのRAMの約4.5MBを占めています。
- SequenceFile、8 GBのHDFSブロックを含む1GBのSequenceFileを使用した後、これらのオブジェクトはNameNodeで約3.6KBのRAMを占有します。
- SequenceFileは分割可能であるため、MapReduceに適しています。
- SequenceFileは圧縮をサポートしています。
サポートされている圧縮。ファイル構造は圧縮タイプによって異なります。
- 非圧縮
Record-Compressed:ファイルに追加されるときに各レコードを圧縮します。
(ソース: csdn.net )
ブロック圧縮
(ソース: csdn.net )
- 圧縮するデータがブロックサイズに達するまで待機します。
- ブロック圧縮は、レコード圧縮よりも優れた圧縮率を提供します。
- SequenceFileを使用する場合、ブロック圧縮が一般的に推奨されるオプションです。
- ここでのブロックは、HDFSまたはファイルシステムブロックとは無関係です。