热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spark的shuffle流程以及寻址流程

图片来自站酷,侵删。Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。本文的主题是讲一下Spark的shuffle寻址过程,在这之前我们先来

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

图片来自站酷,侵删。

Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。

本文的主题是讲一下Spark 的shuffle 寻址过程,在这之前我们先来回忆一下MapReduce 的 shuffle 过程。

在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。

下面是 MapReduce 的 shuffle 过程,数据被拉取到不同的节点上进行聚合处理,会产生大量的磁盘和网络IO。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

Spark 也有自己的 shuffle 过程。下图是 DAG schedula的任务划分,从最后一个RDD往前追溯,遇到宽依赖(shuffle)就划分一个 Stage。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

在DAG 调度的过程中,在划分 Stage 的时候,构建 shuffleDependency 的时候进行shuffle注册,获取后续数据读取所有要的 shuffleHandle,最终每一个 job 提交之后都会生成一个 ResultStage 和若干个 ShuffleMapStage ,其中 ResultStage 表示生成作业的最终结果所在的 Stage, ResultStage 与 shuffleMapStage 中的 task 分别对应着 ResultTask 与shuffleMapTask ,一个作业,除了最终的 ResultStage 外,其他若干 shuffleMapStage 中的各个 shuffleMapTask 都需要将最终的数据根据相应的 Partition 对数据进行分组,然后持久化分区的数据。

回到本文的主题,shuffle 文件寻址,先来明确几个概念

MapOutPutTracker:MapOutPutTracker 是 spark 里面的一个模块,主从架构,用来管理磁盘小文件的地址。
MapOutPutTrackerMaster 是主,存在于 Driver 中;
MapOutPutTrackerWorker 是从,存在于 Executor 中;

BlockManager:块管理者,也是一个 spark 中的一个模块,主从架构。
BlockManagerMaster 是主,存在于 Driver 中。用于在集群中传递广播变量或缓存数据或删除数据的时候通知其他的 跟随节点来进行相应的操作。说白了就是指挥。
BlockManagerWorker是从,存在于 Executor 中。会与 BlockManagerMaster节点进行通信。

无论在 Driver 端的 BlockManager 还是在 Excutor 端的BlockManager 都含有四个对象:

① DiskStore:负责磁盘的管理。

② MemoryStore:负责内存的管理。

③ConnectionManager负责连接其他BlockManagerWorker。

④ BlockTransferService:负责数据的传输。

shuffle 寻址流程:

下面先来看一张图片,大家可以试着跟着图片来理解 shuffle 的文件寻址。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

1.map task运行完毕之后,会将 task 执行之后的产生的磁盘小文件的地址封装到 MapStatus 对象中。通过 MapOutpuTrackerWorker对象向 Driver 中的 MapOutputTrackerMaster 汇报。

2.在所有的 map task 执行完毕后,Driver 中就掌握了所有的磁盘小文件的地址。

3.在 reduce task 执行之前,会通过Executor 中MapOutPutTrackerWorker 的 Driver 端的 MapOutputTrackerMaster 获取磁盘小文件的地址。

4.获取到磁盘小文件的地址后,会通过 BlockManager 中的 ConnectionManager 连接数据所在节点上的 ConnectionManager, 然后通过 BlockTransferService 进行数据的传输。

5. BlockTransferService 默认启动 5 个 task 去节点拉取数据。默认情况下,5 个 task 拉取数据量不能超过 48 M。拉取过来的数据放在 Executor端的shuffle聚合内存中(spark.shuffle.memeoryFraction 0.2), 如果5 个 task 一次拉取的数据放不到shuffle内存中会有 OOM,如果放下一次,不会有 OOM,以后放不下的会放磁盘。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

如何避免OOM

1、拉取数据 少一些。

2、提高ExecutorShuffle聚合内存。

3、提高executor内存。

这里就涉及到 Spark 的内存管理了,这里只是简单的提一下。Spark在Spark1.6之前使用的是静态内存管理,spark1.6之后使用的是统一内存管理,spark.memory.useLegacyMode false(统一内存管理),与静态内存管理的区别在于Storage和Execution共享同一块内存空间,可以动态占用对方的空闲区域 。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

为了保持本文的格式,我保存成图片放上来了。微信排版对于技术文章不是很友好。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》

关于 shuffle 还有很多需要注意的地方,我将在之后的文章介绍一下 shuffle 的调优。

如果对您有帮助,欢迎关注、转发。

《Spark 的 shuffle 流程以及寻址流程》
《Spark 的 shuffle 流程以及寻址流程》


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • Hadoop源码解析1Hadoop工程包架构解析
    1 Hadoop中各工程包依赖简述   Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。   GoogleCluster:ht ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 浅析Mysql数据回滚错误的解决方法_PHP教程:MYSQL的事务处理主要有两种方法。1、用begin,rollback,commit来实现begin开始一个事务rollback事 ... [详细]
author-avatar
手机用户2502902903_601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有