代码改变世界

Hadoop的核心--Map/Reduce

2016-04-05 23:13  一个爱学习的小码农  阅读(1293)  评论(0)    收藏  举报

  Hadoop的核心就是HDFS和MapReduce,而两者只是理论基础,不是具体可使用的高级应用,Hadoop旗下有很多经典子项目,比如HBase、Hive等,这些都是基于HDFS和MapReduce发展出来的。要想了解Hadoop,就必须知道HDFS和MapReduce是什么。

 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.

 MapReduce由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算。这两个函数的形参是key、value对,表示函数的输入信息。
 1.MapReduce作业运行流程:
          
 
  2.流程分析:
  1.在客户端启动一个作业。  

  2.向JobTracker请求一个Job ID。

  3.将运行作业所需要的资源文件复制到HDFS上,包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息。这些文件都存放在JobTracker专门为该作业创建的文件夹中。文件夹名为该作业的Job ID。JAR文件默认会有10个副本(mapred.submit.replication属性控制);输入划分信息告诉了JobTracker应该为这个作业启动多少个map任务等信息。

  4.JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度(这里是不是很像微机中的进程调度呢,呵呵),当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行。对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”。而分配reduce任务时并不考虑数据本地化。

  5.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户。

  3. map任务处理
  1.1 读取输入的HDFS文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
  1.2 实现自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
  1.3 对输出的key、value进行分区。
  1.4 对不同分区的数据,按照key进行排序(按照key进行排序)、分组(按照key分组,把相同key的value放到一个集合中)。
  1.5 (可选)分组后的数据进行归约(归约:简单的讲就是把大的数据集合变成小的数据集合,例如加减法

``````````````

 

  4.reduce任务处理
  2.1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
  2.2 覆盖reduce函数,实现自己的逻辑,对输入的key和values处理,转换成新的key,value输出。
  2.3 把reduce的输出保存到HDFS中。