像wordcount这样的脚本在MapReduce中执行在哪里?

Where is script like wordcount executed in MapReduce?

求知识?当 运行 带有 wordcount jar 的 MapReduce 代码何时执行?是在mapper任务中还是在driver方法中?

When running a MapReduce with a wordcount jar when does the code execute? It executes with main i.e. Driver code and then map code followed by reducer code (if any)

Is it during the mapper task or the driver method? Yes its both.

Driver - 将驱动 map reduce,您可以在其中定义 class 我应该将其用于 mapper、reducer、paritioner、combiner。

Mapper - 映射器是您的字数统计创建键值对映射的地方,键为字,值为出现次数。

Reducer - Reducer 将从每个映射器中获取值,并将所有值与跨映射器的相同键相加,然后给出最终结果。

正如 SMA 正确回答的那样,代码执行从驱动程序 class 的主要方法开始,它使用作业对象的方法 setMapperClass 和 setReducerClass 将控制权传递给映射器和缩减器 class。

查看官方 map reduce tutorial 以获得更好的理解。我用重点来解释例子。

让我们看一下 java 字数统计示例。

  1. 假设您已经创建了wc.jar如下。

    $ jar cf wc.jar WordCount*.class 
    
  2. 现在 运行 WordCount 示例

    $ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
    

    至此你已经分别通过输入目录和输出目录来读取和写入数据。

假设:

/user/joe/wordcount/input - input directory in HDFS
/user/joe/wordcount/output - output directory in HDFS

HDFS中的input目录是Mapper用来读取数据的&HDFS中的output目录是reducer用来存储数据的

应用程序通常实现 MapperReducer 接口以提供映射和缩减方法。这些构成了工作的核心。

如果你看到WordCount的main方法class(你可以称它为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 class、Reducer class、Combiner class、输出键和值 classes 和 Input/Output 文件位置。

有些作业可能只有 Mapper。有些作业会有 Mapper 和 Reducer。除了 Mapper 和 Reducer classes 之外,一些作业还会有 Partitioner 和 Combiner。所以基本上流程由您决定,Hadoop 框架将根据您的输入形成一个工作流。

对于上面的例子:

  1. Mapper 将从 FileInputFormat.addInputPath API 的 HDFS 文件位置读取输入数据。映射器由下面的行设置

    job.setMapperClass(TokenizerMapper.class);
    
  2. Combiner,它是一个小型reducer,将运行映射到Mapper输出。它将通过结合 Mappers 的输出来减少网络 IO。

    job.setCombinerClass(IntSumReducer.class);
    
  3. Reducer 设置如下 API.

    job.setReducerClass(IntSumReducer.class);
    

Mapper

Mapper 将输入 key/value 对映射到一组中间 key/value 对。 Hadoop MapReduce 框架为作业的 InputFormat 生成的每个 InputSplit 生成一个映射任务。

减速机

Reducer 将共享一个键的一组中间值缩减为较小的一组值。

组合器:

用户可以通过Job.setCombinerClass(Class),选择性地指定一个组合器来执行中间输出的本地聚合,这有助于减少从 Mapper 传输到 Reducer 的数据量。