MapReduce核心Java API类和接口
类/接口 | 功能描述 |
org.apache.hadoop.mapreduce.Mapper | 定义了映射阶段的接口,程序员需要实现这个接口来处理输入数据并生成中间键值对。 |
org.apache.hadoop.mapreduce.Reducer | 定义了归约阶段的接口,程序员需要实现这个接口来聚合Mapper产生的中间键值对。 |
org.apache.hadoop.mapreduce.Job | 代表一个MapReduce作业,用来设置作业的各种属性,包括输入输出路径、mapper和reducer类、job配置等,并提交作业到集群运行。 |
org.apache.hadoop.mapreduce.lib.input.TextInputFormat | 定义了如何从输入源读取数据并切分成键值对供给Mapper。 |
org.apache.hadoop.mapreduce.lib.output.TextOutputFormat | 定义了如何将Reducer的输出写入到HDFS或其他存储系统中。 |
Hadoop中用于序列化和反序列化的基类,LongWritable, Text, IntWritable 等,用于在MapReduce过程中传输和持久化数据。 | |
org.apache.hadoop.conf.Configuration | 类用于保存和加载作业的配置参数。 |
在Mapper和Reducer中可用的对象,提供与上下文交互的能力,如写入键值对、报告进度和状态等。 | |
分别负责读取输入文件数据并转换为键值对(由InputFormat提供),以及将Reducer的输出写出到目标文件(由OutputFormat提供)。 |
MapReduce应用开发步骤
1、创建Mapper类:Mapper类是用来处理输入数据并生成中间键值对的,一个简单的单词计数的Mapper类可以如下实现:
public class WordCounterMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { context.write(new Text(itr.nextToken()), new IntWritable(1)); } } }
2、创建Reducer类:Reducer类用来聚合Mapper产生的中间键值对,一个简单的单词计数的Reducer类可以如下实现:
public class WordCounterReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } }
3、设置和提交Job:使用org.apache.hadoop.mapreduce.Job类来设置作业的各种属性,并提交作业到集群运行,示例代码如下:
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordCounterMapper.class); job.setCombinerClass(WordCounterReducer.class); job.setReducerClass(WordCounterReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }
FAQs
1、问题:MapReduce中的Combiner是什么?它的作用是什么?
解答:Combiner是运行在Mapper和Reducer之间的一个组件,它的作用是对Mapper的输出进行局部汇总,从而减少网络传输的数据量,提高整个作业的效率,需要注意的是,Combiner的输出必须是可以被Reducer接受的格式。
2、问题:在MapReduce作业中,为什么需要设置InputFormat和OutputFormat?
解答:InputFormat负责定义如何从输入源读取数据并切分成键值对供给Mapper,而OutputFormat负责定义如何将Reducer的输出写入到HDFS或其他存储系统中,通过设置合适的InputFormat和OutputFormat,可以确保数据的正确读取和写入,满足不同数据处理需求。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1113364.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复