详解MapReduce执行流程
mr原理
为什么要用mapreduce
mapreduce结构及核心运行机制
结构
思想:分而治之,先分后合
其中,maptask的数量是不能设置的,reducetask可以自己设置job.setNumReduceTasks(5);
利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对
将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存
将缓存中的KV对按照K分区排序后不断溢写到磁盘文件
shuffle机制
mapreduce中,map阶段处理的数据如何传递reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle;
shuffle: 洗牌、发牌——(核心机制:数据分区,排序,缓存);
具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;
主要流程
分区partition
Sort根据key排序
Combiner进行局部value的合并
具体来说就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;
maptask收集我们的map()方法输出的kv对,先进入分区方法,把数据标记好分区,然后把数据发送到内存缓冲区(默认100M)中
当环形缓冲区达到80%时,进行溢写,从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 (溢写前对数据进行快速排序,排序按照key的索引进行字典顺序排序)
多个溢出文件会被合并成大的溢出文件(归并排序算法),对溢写的文件也可以进行combiner操作,前提是汇总操作,求平均值不行。
在溢出过程中,及合并的过程中,都要调用partitoner进行分组和针对key进行排序
reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据,拉取的数据先存储在内存中,内存不够了,再存储到磁盘。
reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)
如何写好一篇数据部门规范文档
如何优化整个数仓的执行时长(比如7点所有任务跑完,如何优化到5点)
本文分享自微信公众号 - 大数据私房菜(datagogogo)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Redis哨兵集群中哨兵挂了,主从库还能切换吗?
实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。 1,基于 pub/sub 机制的哨兵集群组成 哨兵之间的相互发现 哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布 / 订阅机制。 哨兵将自己的连接信息 (ip, port) 发布到主库上, 其它哨兵订阅 自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅 Redis 会以频道的形式,对这些消息进行分门别类的管理 所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。 在主从集群中,主库上有一个名为“__sentinel__:hello”的频道,不同哨兵就是通过它来相互发现,实现互相通信的。 哨兵除了彼此之间建立起连接形成集群外,还需要和从库建立连接。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和...
- 下一篇
深挖 Netty 源码:时间轮底层原理分析
本文选自 Doocs 开源社区旗下“源码猎人”项目,作者tydhot[1]。项目将会持续更新,欢迎 Star 关注。项目地址:https://github.com/doocs/source-code-hunter 该文所涉及的 Netty 源码版本为 4.1.6。 HashedWheelTimer 是什么 Netty 的时间轮HashedWheelTimer给出了一个粗略的定时器实现,之所以称之为粗略的实现是因为该时间轮并没有严格的准时执行定时任务,而是在每隔一个时间间隔之后的时间节点执行,并执行当前时间节点之前到期的定时任务。 当然具体的定时任务的时间执行精度可以通过调节 HashedWheelTimer 构造方法的时间间隔的大小来进行调节,在大多数网络应用的情况下,由于 IO 延迟的存在,并不会严格要求具体的时间执行精度,所以默认的 100ms 时间间隔可以满足大多数的情况,不需要再花精力去调节该时间精度。 HashedWheelTimer 的实现原理 HashedWheelTimer 内部的数据结构 private final HashedWheelBucket[] wheel;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群