0

私はhadoopが初めてで、入力ファイルのサイズに対してマップ出力が非常に大きいプログラムを使用しています。

lzo ライブラリをインストールして構成ファイルを変更しましたが、プログラムには何の影響もありませんでした。マップ出力を圧縮するにはどうすればよいですか? lzoが最良のケースですか?

はいの場合、プログラムにどのように実装しますか?

4

2 に答える 2

4

中間出力 (マップ出力) を圧縮するには、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をデフォルトの のままにしておく必要があることにも注意してください。RECORDBLOCK

使用する圧縮の種類を選択するときは、次の 2 つの側面を考慮する必要があると思います。

  • 圧縮率: 実際にどれだけの圧縮が行われるか。% が高いほど、圧縮率が高くなります。
  • IO パフォーマンス: 圧縮は IO 集約型の操作であるため、圧縮方法が異なれば、パフォーマンスへの影響も異なります。

目標は、圧縮率と IO パフォーマンスのバランスを取ることです。圧縮率が非常に高くても IO パフォーマンスが低い圧縮コーデックを使用できます。

どちらを使用すべきか、どれを使用すべきでないかを判断するのは非常に困難です。これはデータにも依存するため、いくつか試してみて、より意味のあるものを確認してください。私の経験では、Snappy と LZO が最も効率的です。最近、LZF も良い候補のように聞こえます。ここで圧縮のベンチマークを提案する投稿を見つけましたが、それをグラウンドトゥルースと見なさず、独自のベンチマークを行うことをお勧めします。

于 2013-02-01T16:30:13.103 に答える