HDFS はどのようにデータを保存しますか?
巨大なファイルを圧縮して保存したい。
例: 1.5 GB のファイルがあり、デフォルトのレプリケーション係数は 3 です。
(1.5)*3 = 4.5 GB のスペースが必要です。
現在、データの暗黙的な圧縮は行われていないと思います。
ファイルを圧縮して HDFS に保存し、ディスク容量を節約する方法はありますか?
HDFS は、任意のファイルを多数の「ブロック」に格納します。ブロック サイズはファイルごとに設定できますが、デフォルト値があります (64/128/256 MB など)。
したがって、ファイルが 1.5 GB でブロック サイズが 128 MB の場合、hadoop はファイルを最大 12 ブロック (12 x 128 MB ~= 1.5 GB) に分割します。各ブロックは、構成可能な回数だけ複製されます。
データが (テキスト ファイルのように) 適切に圧縮される場合、ファイルを圧縮し、圧縮ファイルを HDFS に保存できます。上記と同じことが当てはまります。したがって、1.5 GB のファイルが 500 MB に圧縮される場合、これは 4 ブロックとして保存されます。
ただし、圧縮を使用する際に考慮すべき点の 1 つは、圧縮方法がファイルの分割をサポートしているかどうかです。つまり、ファイル内の位置をランダムに検索して、圧縮されたストリームを復元できます (たとえば、GZIp は分割をサポートしていませんが、BZip2 はサポートしています)。
メソッドが分割をサポートしていない場合でも、hadoop はファイルをいくつかのブロックに保存しますが、ブロックがクラスター全体に分散される可能性が高いため、「データの局所性」の利点が失われます。
Map Reduce コードでは、Hadoop にはデフォルトで多数の圧縮コーデックがインストールされており、特定のファイル拡張子 (たとえば、GZip ファイルの場合は .gz) が自動的に認識されるため、入力/出力を圧縮する必要があるかどうかを心配する必要がなくなります。
これが理にかなっていることを願っています
編集コメントに応じていくつかの追加情報:
Map Reduce ジョブからの出力として HDFS に書き込む場合は、FileOutputFormat の API、特に次のメソッドを参照してください。
ファイルを HDFS にアップロードする場合、はい、事前に圧縮し、その圧縮タイプに関連付けられたファイル拡張子を使用する必要があります (既定では、hadoop は .gz 拡張子の gzip をサポートしているため、file.txt.gz は gzip されたファイルを示します)。 )
@ Hadoop_Summitのプレゼンテーション、特にスライド 6 とスライド 7 をご覧ください。
しばらく前に、ここのブログ投稿でそれを要約しようとしました。ファイルはレプリケーション用の基本ブロックであるブロックに分割されるため、基本的にこれはデータ分割可能性の問題です。Name ノードは、1 つのファイルに属するすべてのブロックを追跡する役割を果たします。圧縮を選択するときは、ブロックが自律的であることが不可欠です。すべてのコーデックが分割可能というわけではありません。フォーマット + コーデックが分割可能でない場合、それは圧縮解除するために、mapreduce の並列処理に大きな影響を与える 1 つの場所にある必要があることを意味します。基本的に単一のスロットで実行されます。それが役立つことを願っています。