大数据学习笔记之MapReduce作业执行流程

MapReduce作业执行流程大致可分为以下几步:①提交作业,②初始化作业,③分配任务,④执行作业,⑤更新进度和状态,⑥完成。又或者可划分为:①输入分片(input  split),②Map阶段,③combiner阶段,④shuffle阶段,⑤reduce阶段。

 

提交作业

主要有几个步骤:

①调用JobTracker的getNewJobId()方法,获取作业ID。

②检查作业相关路径(没有指定输入路径,或者输出路径已经存在,则作业不会被提交)

③计算作业的输入划分,并且将信息写入job.split文件(信息有split文件头,split版本号,个数,类型,大小,内容,location信息等),该文件会用在Map任务开始之前,以此获取文件切分信息。(MR框架会根据作业的InputFormat来检查作业输入的正确性,如格式,还有就是把输入文件切分成多个逻辑InputSplit实例,一个InputSplit会分配给一个独立的Map任务。所以InputSplit的文件信息是由InputFormat来提供的。并且InputFormat提供RecordReader实现,可以从InputSplit中获取输入的key-value对)(input  split阶段)

④复制作业运行需要的资源到对应的HDFS上(包括作业jar包,配置文件,输入划分)

⑤调用JobTracker的submitJob()方法,提交作业。

 

初始化作业

①JobTracker将提交的作业放到一个队列中,交给作业调度器进行调度(调度策略有①FIFO,即先进先出,②公平调度,③容量调度器),并对其进行初始化。

②创建Map任务、Reduce任务 。其中一个split对应一个map,通常一个split就是一个block,因此map的数量通常取决于输入文件的大小,当文件很大时,确保有足够的内存作为排序缓冲区非常重要,这会使得map输出都能在内存中处理,对性能有极大的提升。在map开始产生结果时,并不是直接写到文件中的,而是写到一个环形内存缓冲区(默认100M,可以通过属性mapreduce.task.io.sort.mb配置),每个map都有一个内存缓冲区,而map输出结果可能很多,可能超过100M,所以需要在一定的条件下(一般是缓存使用率达到80%,可以通过属性io.sort.spill.percent配置,默认0.8)将缓存去的数据些人磁盘,然后重新利用这块缓冲区。这个过程叫spill,即溢写,由单独的线程完成,不影响把map结果写入缓冲区的线程。

reduce的个数则由setNumReduceTasks()方法来确定。

 

分配任务

① TaskTracker向JobTracker发送自己的状态(主要是Map任务和Reduce任务的个数是否小于上限,TaskTracker有固定的任务槽,所以Map任务和Reduce任务的个数有上限,在MRV2版本中,不分map和reduce槽,资源统一分配),并根据自身条件选择是否向JobTracker请求新的Task,最后发送心跳。

②JobTracker接收到心跳,分析心跳信息,如果TaskTracker请求一个Task,则任务调度器会将任务信息封装返回给TaskTracker(JobTracker为TaskTracker分配map任务的时候,为了减少网络带宽,会选取距离此任务最近的输入划分文件分配给此TaskTracker)

 

执行任务

①TaskTracker申请到新任务后,首先将任务本地化,主要是任务运行所需要的配置,数据,从HDFS复制到本地(job.split,job.jar,job.xml)

②本地化后调用launchTask()方法启动任务

 

更新任务执行进度和状态

TaskTracker每隔5秒发送给JobTracker的心跳中封装任务状态,报告自己的任务执行状态,JobTracker把所有TaskTracker的统计信息合并起来,生成一个全局的作业进度统计信息

 

完成作业

当JobTracker接收到最后一个任务的已完成通知后,便把作业的状态设置为“成功”,然后清空作业的工作状态,如删除中间输出等

 

combiner阶段

combiner是本地化的reduce操作,可用于对map的输出进行聚集,有助于降低map到reduce数据传输量。

注意:①combiner操作时有风险的,使用它的原则是combiner的输入不会影响到reduce计算的最终输入。如:计算最大、最小值,单词计数等可以使用combiner,但做平均值计算时使用combiner,最终的reduce计算结果会出错。②combiner还有一个性能损失点,因为它需要一次额外的对map输出的序列化/反序列化过程。如果不能通过聚合将map端的输出减少到20%--30%的话,就不适合用combiner。

 

shuffle阶段

shuffle阶段主要是将map阶段的输出进行进一步整理(排序、分割)并交给Reduce。shuffle过程包含在map端和reduce端。在map端的shuffle过程是对map的结果进行分区(partition)、排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起(merge),不同的划分将结果发送给对应的Reduce(map输出的划分和Reduce的对应关系由JobTracker确定)。Reduce端又会将同一个划分的输出进行合并(merge),并对merge的结果进行排序(多路归并排序)。shuffle的过程是mapreduce的核心所在,shuffle过程的性能与整个mapreduce的性能直接相关。

shuffle优化:在一个任务中,耗时最多的一般都是I/O操作。在map端,主要就是shuffle阶段中缓冲区内容超过阈值后的写出操作,可以通过合理地设置io.sort.mb(设置缓存区内存大小)的值来减少写出次数。在reduce端,在reduce的内存需求很小的情况下,将mapred.inmem.merge.threshold设置为0,将mapreed.job.reduce.input.buffer.percent设置为1.0(或者更低的值)能够让I/O操作更少,提升shuffle性能。

 

Reduce阶段

在reduce端,shuffle阶段可以分为三个阶段:复制map输出(copy),排序合并(merge)和reduce处理(reduce)

copy:Reduce会定期向JobTracker获取map的输出位置,一旦拿到输出位置,reduce任务就会从此输出地址对应的TaskTracker上复制输出到本地,而不会等到所有的map任务结束。复制是并行进行的,可通过参数设置提高并行度,提高性能mapreduce.reduce.shuffle.parallelcopies:reuduce shuffle阶段并行传输数据的数量,默认值为5)。

merge:在reduce复制map的输出结果的同事,reduce任务就进入了合并阶段。这一阶段主要任务是将从各个map的TaskTracker上复制过来的数据进行整合。

reduce:reduce的最后哦阶段就是对合并的文件进行reduce处理。

 

Hadoop性能优化

配置文件优化

调节适当的参数,在调参数时要进行测试。

core-site.xml 文件的优化

1.fs.trash.interval,默认值: 0;说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。一般开启这个会比较好,以防错误删除重要文件。单位是分钟。

2. dfs.namenode.handler.count,默认值:10;说明:hadoop系统里启动的任务线程数,可以尝试该值大小对效率的影响变化进行最合适的值的设定。

3. mapreduce.tasktracker.http.threads,默认值:40;说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。

mapred-site.xml 文件的优化

1. 修改最大槽位数:槽位数是在各个 tasktracker 上的 mapred-site.xml 上设置的,默认都是 2,可以设置为一个较大的值,是的每个节点上同时运行的map和reduce任务数增加,从而减少运行时间,提升性能。

<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>2</value>

</property>

<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>2</value>

</property>

2. 调整心跳间隔:集群规模小于 300 时,心跳间隔为 300 毫秒

mapreduce.jobtracker.heartbeat.interval.min 心跳时间
mapred.heartbeats.in.second 集群每增加多少节点,时间增加下面的值
mapreduce.jobtracker.heartbeat.scaling.factor 集群每增加上面的个数,心跳增多少

3. 配置 RPC hander 数目

mapred.job.tracker.handler.count 默认是 10,可以改成 50,根据机器的能力

4.配置 HTTP 线程数目

tasktracker.http.threads 默认是 40,可以改成 100 根据机器的能力

5.shuffle期间并行传输的默认数量

mapreduce.reduce.shuffle.parallelcopies 默认是 5

 

代码的优化

设置combiner,combiner的个数尽量与reduce的个数相同,数据的类型保持一致,可以减少拆包与封包的进度

 

系统的优化

可以设置linux系统打开最大的文件数预计网络的带宽MTU的配置

 

输入采用大文件

Hadoop适用于处理大量的大文件,无法高效的存储大量的小文件。当mapreduce处理数据时,map阶段输入的文件较小而且数量众多时,就会产生很多的map任务,所以可以对大量的小文件做合并预处理,减少map的数量,提升性能,还能减少占用空间。

 

压缩文件

在map输出的大小超出一定限度,map task就会将结果写入磁盘,而I/O占用时间较长。一个提高性能的方法是对map的输出进行压缩。可以通过将mapred.compress.map.output属性设置为true来对map的输出数据进行压缩

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值