引言
- 在编写Mapreduce程序的过程中会遇到各种各样的问题,本文为您梳理了常见的问题、注意事项和技巧;
MapReduce中常见的数据类型转换方法
类型转换 | 方法汇总 |
---|---|
int>String | int i=12345; String s=””; 第一种方法:s=i+””; 第二种方法:s=String.valueOf(i); |
String>int | s=”12345”; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); |
LongWritable>String | LongWritable.toString() |
String>long | Long.parseLong(String) |
Text>String | Text.toString() |
long>LongWritable | new LongWritable(long) |
String>Text | new Text(String) |
编程注意事项
hadoop特有的数据类型(LongWritable、IntWritable和Text等)和java的数据结构(set、list、map等)不兼容,以下使用情形会出错:
例如:Set <Text> userSet = new HashSet<Text>();
或者List <LongWritable> list = new ArrayList <LongWritable>();
所以尽量不要同时使用;reduce中遍历values的过程只能执行一遍,因为values是Iterable迭代器类型;如果需要多次遍历values内容,要么每次遍历前移动迭代器指针到初始位置,要么第一次遍历时将values内容放入list中,方便以后重复访问;
map的输出必须是Writable类型的(比如IntWritable、LongWritable、Text),如果是普通java类型(Integer、Long、String)会出错(报错:Unable to initialize MapOutputCollector);
map的输入固定为
,输入类型为
Mapreduce程序参数设置
参数 | 设置方法 |
---|---|
不执行reduce函数 | job.setNumReduceTasks(0);此时不执行reduce,输出文件的数量就是map的数量; |
设置执行map的类 | job.setMapperClass(FlowFilter.class); |
设置执行combine的类(一般就是reduce类) | job.setCombinerClass(Reduce.class); |
设置执行reduce的类 | job.setReducerClass(DNTGUserInfoReducer.class); |
设置map的数量 | job.setNumMapTasks(maps); |
设置reduce数量(最终输出文件数量) | job.setNumReduceTasks(reduces); |
设置文件输入类型(默认为inputFormat,一行一行读取) | job.setInputFormatClass(ProvinceInputFormat.class); |
设置map的输出类型(key、value类型) | job.setMapOutputKeyClass(HMKey.class); job.setMapOutputValueClass(HMValue.class); |
设置redcue的输出类型(key、value类型) | job.setReduceOutputKeyClass(Text.class); job.setReduceOutputValueClass(IntWritable.class); |
统一设置map和reduce的输出类型 | job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); |
设置整个程序输入、输出路径 | FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); |