1.单输入格式
指定输入格式ParquetInputFormat
//指定输入格式
job.setMapperClass(ParquetMap.class);
job.setInputFormatClass(ParquetInputFormat.class);
ParquetInputFormat.addInputPath(job, new Path(args[1]));
ParquetInputFormat.setReadSupportClass(job, CheckLevelRunner.MyReadSupport.class);
//这个提供的是定义读文件的方式
public static final class MyReadSupport extends DelegatingReadSupport<Group> {
public MyReadSupport() {
super(new GroupReadSupport());
}
@Override
public org.apache.parquet.hadoop.api.ReadSupport.ReadContext init(InitContext context) {
return super.init(context);
}
}
//解析parquet的map
static class ParquetMap extends Mapper<Void, Group, Text, Text> {
protected void map(Void key, Group value, Mapper<Void, Group, Text, Text>.Context context) {
try {
//取key1字段的值
String md5sha1=value.getString("key1", 0);
//map输出outputKey、outputValue
context.write(new Text(outputKey), new Text(outputValue));
} catch (Exception e) {
return;
}
}
}
解析Parquet遇到空文件的情况:
此时可以设置mapreduce容错参数:
Mapreduce.map.failures.maxpercent:这个参数表示当Map Task失败比例超过该值,则整个作业失败,默认值为0。在这里设置成5,任务map的数量与输入文件数量一致,因此如果空文件的数量小于5%,任务成功,大于5%,任务失败。
job.getConfiguration().set("mapreduce.map.failures.maxpercent", "5");
2.多输入格式
其中一个目录的文件格式是Text,另一个是Parquet。使用MultipleInputs根据输入源设置多个map来处理数据。
//设置多输入、多mapper
MultipleInputs.addInputPath(job, new Path(path1), TextInputFormat.class, NormalMap.class);
MultipleInputs.addInputPath(job, new Path(path2), ParquetInputFormat.class, ParquetMap.class);
ParquetInputFormat.setReadSupportClass(job, CheckLevelRunner.MyReadSupport.class);
3.mapreduce中调用http接口遇到的问题
将程序部署服务器上,发现会报这个错:
Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE,
调查发现,是因为httpclient有两个版本,自己引入了4的版本,而org.apache.hadoop这个包中包含了httpclient3.1的版本,两个版本冲突,最后去掉了自己引入的版本,使用了hadoop包中3.1的httpclient。
参考文章
https://www.cnblogs.com/EnzoD...
https://blog.csdn.net/woloqun...
https://blog.csdn.net/csdnmrl...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。