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); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值