私はhadoopが初めてで、入力ファイルのサイズに対してマップ出力が非常に大きいプログラムを使用しています。
lzo ライブラリをインストールして構成ファイルを変更しましたが、プログラムには何の影響もありませんでした。マップ出力を圧縮するにはどうすればよいですか? lzoが最良のケースですか?
はいの場合、プログラムにどのように実装しますか?
私はhadoopが初めてで、入力ファイルのサイズに対してマップ出力が非常に大きいプログラムを使用しています。
lzo ライブラリをインストールして構成ファイルを変更しましたが、プログラムには何の影響もありませんでした。マップ出力を圧縮するにはどうすればよいですか? lzoが最良のケースですか?
はいの場合、プログラムにどのように実装しますか?
中間出力 (マップ出力) を圧縮するには、mapred-site.xml で次のプロパティを設定する必要があります。
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.LzoCodec</value>
</property>
ジョブごとに実行したい場合は、次のいずれかの方法でコードに直接実装することもできます。
conf.set("mapred.compress.map.output", "true")
conf.set("mapred.map.output.compression.codec", "org.apache.hadoop.io.compress.LzoCodec");
また
jobConf.setMapOutputCompressorClass(LzoCodec.class);
また、中間出力の圧縮によりパフォーマンスが低下するため、プロパティmapred.output.compression.type
をデフォルトの のままにしておく必要があることにも注意してください。RECORD
BLOCK
使用する圧縮の種類を選択するときは、次の 2 つの側面を考慮する必要があると思います。
目標は、圧縮率と IO パフォーマンスのバランスを取ることです。圧縮率が非常に高くても IO パフォーマンスが低い圧縮コーデックを使用できます。
どちらを使用すべきか、どれを使用すべきでないかを判断するのは非常に困難です。これはデータにも依存するため、いくつか試してみて、より意味のあるものを確認してください。私の経験では、Snappy と LZO が最も効率的です。最近、LZF も良い候補のように聞こえます。ここで圧縮のベンチマークを提案する投稿を見つけましたが、それをグラウンドトゥルースと見なさず、独自のベンチマークを行うことをお勧めします。