(5) (可选)分组后的数据进行归约Combiner。
第二步:reduce任务处理
(1) 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。一个parttition输出到一个reducer,不同parttion输出到不同reducer
(2) 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
(3) 把reduce的输出保存到文件中。
图2.3中所对应的blick就是HDFS上面的块文件,在hadoop2版本默认设置128MB为一个块,默认一个切片split对应一个块block,但是,切片大小也可以自己设置,根据hadoop的MapReduce源码可以看出来,决定切片split大小是有FileInputFormat类中的long splitSize=computeSplitSize (blockSize,minSize,maxSize)有三个参数决定,其中blockSize=134217728字节=128M,maxSize =2的63次幂-1;computeSplitSzie方法return Max.max(miniSize,Max.min(maxSize,blocSize)); minSize=1,maxSize<blockSize,所以,默认splitSize=128Mb。尽量使用默认大小128M,一个block对应一个split对应一个map,可以避免不同datanode之间的网络传递。一个切片split对应一个map,所以只要知道有多少个切片split就知道启用多少个map。
上文中已经详细介绍了HDFS存储机制和MapReduce程序详细的执行过程,下文进行详细介绍一个hadoop程序如何进行完整的计算。从读取数据到MapReduce计算到输出数据。整个hadoop程序计算流程如下。
(1).客户端提交一个mr的jar包给JobClient(提交方式:hadoop jar ...)
(2).JobClient通过RPC和JobTracker进行通信,返回一个存放jar包的地址(HDFS)和jobId
(3).client将jar包写入到HDFS当中(path = HDFS上的地址 + jobId)
(4).开始提交任务(任务的描述信息,不是jar, 包括jobid,jar存放的位置,配置信息等等)
(5).JobTracker进行初始化任务
(6).根据任务的输入信息读取HDFS上的要处理的文件,计算文件处理的分块,然后分配MapperTask的大小。
(7).TaskTracker通过心跳机制领取任务(任务的描述信息)
(8).下载所需的jar,配置文件等
(9).TaskTracker启动一个java child子进程,用来执行具体的任务( MapperTask或ReducerTask)
(10).将结果写入到HDFS当中
图2.2 MapReduce的工作流程
图2.3 MapReduce执行任务流程图
2.3 高可用HADOOP集群搭建及优化
本节首先将对将Hadoop云平台的软硬件信息进行详细介绍,然后将对Hadoop集群的搭建和优化过程进行详细分析和测试,从最底层的Linux到Hadoop的监控界面的搭建详细研究,并在最后搭建一个完全分布式、高可靠性的Hadoop集群。
2.3.1 集群整体架构设计
本小节将详细介绍hadoop集群的搭建,首先将概况讲解本文hadoop集群的软件信息,接着讲解详细的集群搭建过程。设定整个hadoop集群软件配置如下表2.1所示。
Hadoop搭建环境要求是Linux,本文选用CentOS6.6版本;JDK选用jdk1.75版本,apache-hadoop版本选用cloudera稳定版本hadoop-2.5.0-cdh5.3.6,zookeeper使用zookeeper-3.4.5-cdh5.3.6版本呢,以上均使用稳定版本的。
表2.1 系统开发组件及软件信息表
开发平台 CentOS6.6
集成开发环境 JDK 1.7
软件开发工具 MyEclipes
Hadoop版本 hadoop-2.5.0-cdh5.3.6
协调服务zookeeper