我在寻求知识?当使用wordcount jar运行MapReduce时,代码何时执行?是在映射程序任务中还是在驱动程序方法中?
当使用wordcount jar运行MapReduce时,代码何时执行?它使用主代码执行,即驱动程序代码,然后是映射代码,后面是减速器代码(如果有)
是在映射程序任务中还是在驱动程序方法中?是的,两者都有。
Driver-将驱动映射reduce,在这里您定义我应该为mapper、reducer、partioner和combiner使用哪个类。
Mapper-Mapper是单词计数创建键值对映射的地方,键为单词,值为发生次数。
Reducer-Reducer将从每个映射器中获取值,并将所有值与跨映射器的同一密钥相加,从而得到最终结果。
SMA正确回答,代码执行从驱动程序类的main方法开始,该方法使用作业对象的方法setMapperClass、setReducerClass将控制权传递给mapper和reducer类。
查看官方地图缩减教程以更好地理解。我用要点来解释这个例子。
让我们来看看java单词计数示例。
-
假设您已经创建了wc.jar,如下所示。
$ jar cf wc.jar WordCount*.class
-
现在运行WordCount示例
$ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
现在您已经传递了inputdirectory&分别用于读取和写入数据的输出目录。
假设:
/user/joe/wordcount/input - input directory in HDFS
/user/joe/wordcount/output - output directory in HDFS
HDFS中的输入目录被Mapper用来读取数据&reducer使用HDFS中的输出目录来存储数据
应用程序通常实现Mapper
和Reducer
接口以提供映射和减少方法。这些构成了工作的核心。
如果你看到WordCount类的主要方法(你可以称之为Driver
程序),
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(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.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);
}
我们正在设置Mapper类、Reducer类、Combiner类、Output Key&值类和输入/输出文件位置。
某些作业可能只有Mapper。某些作业将具有"映射器"one_answers"还原器"。一些作业将具有Partitioner&除了Mapper&减速器等级。因此,基本上流程由您决定,Hadoop框架将根据您的输入形成工作流。
例如:
映射器将从
FileInputFormat.addInputPath
API的HDFS文件位置读取输入数据。映射器由线下设置job.setMapperClass(TokenizerMapper.class);
Combiner是一个小型减速器,将在Mapper输出上运行。它将通过组合映射器的输出来减少网络IO。
job.setCombinerClass(IntSumReducer.class);
减速器由以下API设定。
job.setReducerClass(IntSumReducer.class);
映射器
映射器将输入键值对映射到一组中间键值对。Hadoop MapReduce框架为作业的InputFormat生成的每个InputSplit生成一个映射任务。
减速器
Reducer将共享一个键的一组中间值缩减为一组较小的值。
组合器:
用户可以选择通过Job.setCombinerClass(Class),
指定一个组合器来执行中间输出的本地聚合,这有助于减少从Mapper传输到Reducer的数据量。