1. 程式人生 > >MapReduce 讀寫 lzo 壓縮檔案 詳細

MapReduce 讀寫 lzo 壓縮檔案 詳細

問題:
用java編寫mapreduce程式時,lzo格式作為輸入跟用文字作為輸入一樣,可以把lzo檔案當做文字直接使用,但是一個lzo檔案會分在一個map上,如果lzo檔案過大,希望用多個map時,調整mapred.min.split.size和mapred.max.split.size就不好使了。

解決方法:
lzo檔案建索引,索引檔案與lzo檔案同名,字尾為.index,其方法為應用 hadoop-lzo-0.4.17.jar 包執行
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.17.jar com.hadoop.compression.lzo.LzoIndexer hdf://inputpath(程式輸入路徑.lzo)

設定job的inputformat:預設的是TextInputFormat,這裡要改成job.setInputFormatClass(LzoTextInputFormat.class)
加上這些之後,再設定mapred.min.split.size和mapred.max.split.size就可以調整map個數了

設定輸出 為lzo 壓縮檔案
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, LzopCodec.class);
int result = job.waitForCompletion(true) ? 0 : 1;

    //上面的語句執行完成後,會生成最後的輸出檔案,可以在此基礎上新增lzo的索引
    LzoIndexer lzoIndexer = new LzoIndexer(conf);
    lzoIndexer.index(new Path(args[1]));

注 mapReduce 改變 map d的並行數
原理:改變資料輸入的分片數(block 數) 即改變MAPReduce 中切分的最大最小配置 即配置 MapReduce 的 main 方法中
配置

      System.out.println(Arrays.toString(args));
	Configuration config = new Configuration();
	config.setLong("mapred.min.split.size",33554432);
	config.setLong("mapred.max.split.size",67108864);