问题:
用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);