MapReduce入门(三)

MapReduce工作

MapTask

  • InputFormat (默认 TextInputFormat)会通过 getSplits方法对输入目录中文件进行逻辑切片规划得到 splits,有几个切片就有几个maptask

  • 将输入文件切分为splits之后 , 由 RecordReader 对 象(默认LineRecordReader)一行一行读,

    返回kv对 Key 表示每行首字符偏移值,value 表示这一行文本内容。

  • kv对进入用户自定义的mapper类中, 调用map函数

  • kv对通过context.write输出进行collect数据收集, 在collect中, 会进行分区处理,默认为hash

  • collect后, 数据会写到内存中,称为环形缓冲区(memory buffer), 缓冲区的作用是批量收集 map 结果,减少磁盘 IO 的影响. 缓冲区默认100M , 在达到条件后溢出 ( spill ), 写入磁盘形成临时文件. 溢出的默认比例是0.8

    当缓冲区到达80M时, 会进行溢出操作, 剩余20M可以继续进行写入操作

  • 溢出时, 会对80M中的kv对(序列化后的字节)进行排序, 如果设置了combiner,还会进行局部聚合

  • 溢出到磁盘后, 形成临时文件, 直到maptask处理结束, 对临时文件进行merge合并,等待reduce拉取

ReduceTask

  • reduce开启fetcher线程去copy数据, 通过http请求多个maptask获得属于自己的分区文件
  • copy过来的数据会放进内存缓冲区, 这里的缓冲区是动态的, 当内存中的数据到达一个阈值后, 启动内存到磁盘的merge, 在磁盘生成溢出文件, 直到没有数据溢出后, 磁盘中的文件进行merge形成最终文件
  • 最终文件会对合并后的数据进行排序 默认为key的字典序
  • 对排序后的数据进行reduce, key相同的kv对 调用一次reduce方法

Shuffle机制

Map 产生输出开始到Reduce 取得数据作为输入之前的过程称作 shuffle

是 MapReduce 框架中最关键的一个流程

在这里插入图片描述

1).Collect 阶段:将 MapTask 的结果输出到默认大小为 100M 的环形缓冲区,保存的是 key/value, Partition 分区信息等。
2).Spill 阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了 combiner,还会将有相同分区号和 key 的数据进行排序。
3).Merge 阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask 最终只产生一个中间数据文件。
4).Copy 阶段: ReduceTask 启动 Fetcher 线程到已经完成 MapTask 的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5).Merge 阶段:在 ReduceTask 远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
6).Sort 阶段:在对数据进行合并的同时,会进行排序操作,由于 MapTask阶段已经对数据进行了局部的排序,ReduceTask 只需保证 Copy 的数据的最终整体有效性即可。

MapReduce并行度机制

并行度机制是指有多少个并行的task共同处理任务

MapTask

map 阶段并行度由客户端在提交job 时决定 , 客户端提交 job 之前会对待处理数据进行逻辑切片

切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

在 FileInputFormat 中,计算切片大小的逻辑:
Math.max(minSize, Math.min(maxSize, blockSize));
切片主要由这几个值来运算决定:
minsize:默认值:1
配置参数: mapreduce.input.fileinputformat.split.minsize
maxsize:默认值:Long.MAXValue
配置参数:mapreduce.input.fileinputformat.split.maxsize
blocksize  hadoop2.X 默认为128M

当 bytesRemaining(剩余待切片数据)/splitSize > 1.1 不满足的话,那么最后所有剩余的会作为一个切片。从而不会形成例如 129M 文件规划成两个切片的局面。

ReduceTask

Reducetask 数量的决定是可以直接手动设置

如果数据分布不均匀,就有可能在 reduce 阶段产生数据倾斜。

默认情况下,每一个 task 都是一个新的 JVM 实例,都需要开启和销毁的开销。在一些情况下,JVM 开启和销毁的时间可能会比实际处理数据的时间要消耗的长,配置 task 的 JVM 重用可以改善该问题(mapred.job.reuse.jvm.num.tasks,默认是 1,表示一个 JVM 上最多可以顺序执行的 task 数目(属于同一个 Job)是 1。也就是说一个 task 启一个 JVM)

MapReducec优化参数

  • mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB),默认为 1024。

    如果 Map Task 实际使用的资源量超过该值,则会被强制杀死。

  • mapreduce.reduce.memory.mb: 一个 Reduce Task 可使用的资源上限(单位:MB),默认

    为 1024。如果 Reduce Task 实际使用的资源量超过该值,则会被强制杀死

  • mapreduce.task.io.sort.mb 100 shuffle 的环形缓冲区大小,默认 100m

  • mapreduce.map.sort.spill.percent 0.8 环形缓冲区溢出的阈值,默认 80%

  • mapreduce.map.maxattempts: 每个 Map Task 最大重试次数,一旦重试参数超过该值,则

    认为 Map Task 运行失败,默认值:4。

  • mapreduce.reduce.maxattempts: 每个Reduce Task最大重试次数,一旦重试参数超过该值,

    则认为 Map Task 运行失败,默认值:4。

  • mapreduce.map.failures.maxpercent: 当失败的 Map Task 失败比例超过该值,整个作业则失败,默认值为 0. 设置为5 则允许5%的maptask失败

  • mapreduce.reduce.failures.maxpercent: 当失败的 Reduce Task 失败比例超过该值为,整个作业则失败,默认值为 0.

  • mapreduce.task.timeout:如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该 task 处于 block 状态,为了防止因为用户程序永远 block 不退出,强制设置了一个超时时间(单位毫秒),默认是600000,值为 0 将禁用超时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值