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); 

猜你喜欢

转载自blog.csdn.net/weixin_40809627/article/details/83029268
LZO