热门标签 | 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 流程以及寻址流程》


推荐阅读
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Python ATM与购物车项目实战:深入解析三层架构设计
    本文详细解析了Python ATM与购物车项目的三层架构设计,重点介绍了MVC(Model-View-Controller)模式的应用。在用户界面层,系统通过图形化界面与用户进行交互,接收并处理用户的输入数据,随后将这些数据传递给控制层进行进一步处理。该层不仅负责展示信息,还承担了用户请求的初步处理任务。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
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社区 版权所有