2017-03-24 42 views
0

NameNodeによって割り当てられたブロック数を減らすため。小さなファイルを連結して128MBのファイルにしようとしています。これらの小さなファイルはgz形式であり、128MBファイルもgz形式でなければなりません。同じ入力/出力ディレクトリのサイズが違う(同じデータの場合)

これを達成するために、すべての小さなファイルの合計サイズを取得し、この合計サイズ(MB)を128で割り、必要なファイル数を取得します。

それからrdd.repartition(nbFiles).saveAsTextFile(PATH,classOf[GzipCodec])

問題は私の出力ディレクトリのサイズは私の入力ディレクトリサイズ(10%以上)・タント高いことである行います。私はデフォルトと最高の圧縮レベルでテストして、私はいつもより高い出力サイズを得ています。

なぜ私の出力ディレクトリが私の入力ディレクトリよりも高くなっているのか分かりませんが、入力ディレクトリのすべてのファイルを再分割しているという事実にリンクしていると思います。

なぜ私はこの結果を得ているのか理解できる人がいますか?

ありがとうございました:)

+0

ファイル数はnbFilesに等しいですか? – FaigB

+0

nbFilesは、128MBのサイズのファイルを出力するために生成するファイルの数です。 (sumSize/128MB) –

答えて

1

圧縮のレベルはデータの配布によって異なります。 rdd.repartition(nbFiles)ではすべてのデータをランダムにシャッフルするので、入力に構造があり、エントロピーが減少し、より良い圧縮が可能になった場合、データは失われます。

colaesceのように、シャッフルや並べ替えをしないと、より良い結果が得られるかどうかを確認できます。

関連する問題