亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
695
2025-04-03
5.2.3? 在MapReduce中使用壓縮
前面講到通過CompressionCodecFactory來推斷CompressionCodec時指出,如果輸入文件是壓縮的,那么在根據文件擴展名推斷出相應的codec后,MapReduce會在讀取文件時自動解壓縮文件。
要想壓縮MapReduce作業的輸出,應在作業配置過程中將mapreduce. output.fileoutputformat.compress屬性設為true,將mapre-duce. output.fileoutputformat.compress.codec屬性設置為打算使用的壓縮codec的類名。另一種方案是在FileOutputFormat中使用更便捷的方法設置這些屬性,如范例5-4所示。
范例5-4. 對查找最高氣溫作業所產生輸出進行壓縮
public class MaxTemperatureWithCompression {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println("Usage: MaxTemperatureWithCompression " +
"
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
job.setMapperClass(MaxTemperatureMapper.class);
job.setCombinerClass(MaxTemperatureReducer.class);
job.setReducerClass(MaxTemperatureReducer.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
我們按照如下指令對壓縮后的輸入運行程序(輸出數據不必使用相同的壓縮格式進行壓縮,盡管本例中不是這樣):
% hadoop MaxTemperatureWithCompression input/ncdc/sample.txt.gz output
最終輸出的每個部分都是經過壓縮的。在這里,只有一部分結果:
% gunzip -c output/part-r-00000.gz
1949??? 111
1950??? 22
如果為輸出生成順序文件(sequence file),可以設置mapreduce.out put.fileoutputformat.compress.type屬性來控制限制使用壓縮格式。默認值是RECORD,即針對每條記錄進行壓縮。如果將其改為BLOCK,將針對一組記錄進行壓縮,這是推薦的壓縮策略,因為它的壓縮效率更高(參見5.4.1節)。
SequenceFileOutputFormat類另外還有一個靜態方法putCompressionType(),可以用來便捷地設置該屬性。
表5-5歸納概述了用于設置MpaReduce作業輸出的壓縮格式的配置屬性。如果你的MapReduce驅動使用Tool接口(參見6.2.2節),則可以通過命令行將這些屬性傳遞給程序,這比通過程序代碼來修改壓縮屬性更加簡便。
表5-5. MapReduce的壓縮屬性
屬性名稱
類型
默認值
描述
mapreduce.output.
fileoutputformat.compress
boolean
false
是否壓縮輸出
mapreduce.output.
fileoutputformat.
compress.codec
類名稱
org.apache.hadoop.io.
compress.DefaultCodec
map輸出所用的壓縮codec
mapreduce.output.
fileoutputformat.
compress.type
String
RECORD
順序文件輸出可以使用的壓縮類型:NONE、RECORD或者BLOCK
盡管MapReduce應用讀/寫的是未經壓縮的數據,但如果對map階段的中間輸入進行壓縮,也可以獲得不少好處。由于map任務的輸出需要寫到磁盤并通過網絡傳輸到reducer節點,所以通過使用LZO、LZ4或者Snappy這樣的快速壓縮方式,是可以獲得性能提升的,因為需要傳輸的數據減少了。啟用map任務輸出壓縮和設置壓縮格式的配置屬性如表5-6所示。
表5-6. map任務輸出的壓縮屬性
屬性名稱
類型
默認值
描述
mapreduce.map.
output.compress
boolean
false
是否對map任務輸出進行壓縮
mapreduce.map.
output.compress.codec
Class
org.apache.hadoop.io.
compress.DefaultCodec
map輸出所用的壓縮codec
下面是在作業中啟用map任務輸出gzip壓縮格式的代碼(使用新API):
Configuration conf = new Configuration();
conf.setBoolean(Job.MAP_OUTPUT_COMPRESS, true);
conf.setClass(Job.MAP_OUTPUT_COMPRESS_CODEC, GzipCodec.class,
CompressionCodec.class);
Job job = new Job(conf);
在舊的API中(參見附錄D),JobConf對象中可以通過更便捷的方法實現該功能:
conf.setCompressMapOutput(true);
conf.setMapOutputCompressorClass(GzipCodec.class);
大數據 Hadoop MapReduce
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。