Hadoop + Spark生态系统操作与实战指南
上QQ阅读APP看书,第一时间看更新

第3章 Hadoop基础与原理

3.1 MapReduce原理介绍

3.1.1 MapReduce的框架介绍

MapReduce模型主要包含Mapper类和Reducer类两个抽象类。Mapper类主要负责对数据的分析处理,最终转化为key-value数据对;Reducer类主要获取key-value数据对,然后处理统计,得到结果。MapReduce实现了存储的均衡,但没有实现计算的均衡。MapReduce框架如图3-1所示。

图3-1 MapReduce框架

MapReduce主要包括JobClient、JobTracker、TaskTracker、HDFS 4个独立的部分。

1. JobClient

配置参数Configuration,并打包成jar文件存储在HDFS上,将文件路径提交给JobTracker的Master服务,然后由Master创建每个task将它们分发到各个TaskTracker服务中去执行。

2. JobTracker

这是一个Master服务,程序启动后,JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker和job的健康状况,一旦发生失败,即将之转移到其他节点上,同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用户可以根据自己的需要设计相应的调度器。

3. TaskTracker

TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接受作业,并负责直接执行每个任务。TaskTracker会周期性地通过Heartbeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令,并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供MapTask和Reduce Task使用。TaskTracker通过slot数目(可配置参数)限定Task的并发度。

Task分为Map Task和Reduce Task两种,均由TaskTracker启动。HDFS以block块存储数据,MapReduce处理的最小数据单位为split。split如何划分由用户自由设置。split和block之间的关系如图3-2所示。

图3-2 split和block之间的关系

4. HDFS

HDFS相关内容在3.2节和3.3节介绍。

3.1.2 MapReduce的执行步骤

MapReduce的执行步骤如图3-3所示。

图3-3 MapReduce的执行步骤

1. Map任务处理

(1)读取HDFS中的文件。每一行解析成一个<k, v>。每一个键值对调用一次map函数。比如:<0, hello you>、<10, hello me>。

(2)覆盖map(),接收第(1)步产生的<k, v>,进行处理,转换为新的<k, v>输出。比如:<hello,1>、<you,1>、<hello,1>、<me,1>。

(3)对上面(1)(2)两步输出的<k, v>进行分区,默认分为一个区。

(4)对不同分区中的数据进行排序(按照k)、分组。分组指的是相同key的value放到一个集合中。

• 排序后:<hello,1>、<hello,1>、<me,1>、<you,1>。

• 分组后:<hello, {1,1}>、<me, {1}>、<you, {1}>。

(5)(可选)对分组后的数据进行归约。

2. Reduce任务处理

(1)多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上(shuffle)。

(2)对多个map的输出进行合并、排序。覆盖reduce函数,接收的是分组后的数据,实现自己的业务逻辑,<hello,2> <me,1> <you,1>处理后,产生新的<k, v>输出。

(3)对reduce输出的<k, v>写到HDFS中。