2(MapReduce)

思想:分而治之

一,执行流程

 

 

 

由图我们可以看到, MapReduce存在以下4个独立的实体。

  1. JobClient:运行于client node,负责将MapReduce程序打成Jar包存储到HDFS,并把Jar包的路径提交到Jobtracker,由Jobtracker进行任务的分配和监控。
  2. JobTracker:运行于name node,负责接收JobClient提交的Job,调度Job的每一个子task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。
  3. TaskTracker:运行于data node,负责主动与JobTracker通信,接收作业,并直接执行每一个任务。
  4. HDFS:用来与其它实体间共享作业文件。

各实体间通过以下过程完成一次MapReduce作业:

  1. JobClient通过RPC协议向JobTracker请求一个新应用的ID,用于MapReduce作业的ID
  2. JobTracker检查作业的输出说明。例如,如果没有指定输出目录或目录已存在,作业就不提交,错误抛回给JobClient,否则,返回新的作业ID给JobClient
  3. JobClient将作业所需的资源(包括作业JAR文件、配置文件和计算所得得输入分片)复制到以作业ID命名的HDFS文件夹中
  4. JobClient通过submitApplication()提交作业
  5. JobTracker收到调用它的submitApplication()消息后,进行任务初始化
  6. JobTracker读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个TaskTracker
  7. TaskTracker通过心跳机制领取任务(任务的描述信息)
  8. TaskTracker读取HDFS上的作业资源(JAR包、配置文件等)
  9. TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
  10. TaskTracker将Reduce结果写入到HDFS当中

二,工作原理

 

 

 

Map任务处理

  1. 需要对输入文件进行“分片”,也就是把所要输入的文件copy到HDFS中
  2. 启动job读取HDFS中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数
  3. 重写map(),对第一步产生的<k,v>进行处理,转换为新的<k,v>输出
  4. 对输出的key、value进行分区
  5. 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中
  6. (可选) 对分组后的数据进行归约

Reduce任务处理

 

  1. 进入reduce阶段。相同的key的map输出会到达同一个reducer,reducer对key相同的多个value进行“reduce操作”
  2. 多个map任务的输出,按照不同的分区,通过网络复制到不同的reduce节点上
  3. 对多个map的输出进行合并、排序。
  4. 重写reduce函数实现自己的逻辑,对输入的key、value处理,转换成新的key、value输出
  5. 把reduce的输出保存到文件中

       

   Map-Reduce框架的运作完全基于<key,value>对,即数据的输入是一批<key,value>对,生成的结果也是一批<key,value>对,只是有时候它们的类型不一样而已。Key和value的类由于需要支持被序列化(serialize)操作,所以它们必须要实现Writable接口,而且key的类还必须实现WritableComparable接口,使得可以让框架对数据集的执行排序操作。 

Map:<k1,v1> ->list<k2,v2>

Reduce:<k2,list<v2>> -><k3,v3>

一个Map-Reduce任务的执行过程以及数据输入输出的类型如下所示:

(input)<k1,v1> -> map -> <k2,v2> -> combine -> <k2,v2> -> reduce -> <k3,v3>(output)

 

原文链接:https://www.jianshu.com/p/ca165beb305b

原文链接:https://blog.csdn.net/spy_h/article/details/80747329

posted @ 2020-07-12 21:53  bug开发工程师  阅读(143)  评论(0编辑  收藏  举报