【摘要】 external-shuffle-service是Spark里面一个重要的特性,有了它后,executor可以在不同的stage阶段动态改变数量,大大提升集群资源利用率。但是这个特性当前在k8s上并不能很好的运行。让我们来看看,在k8s上要实现这个external-shuffle-service特性的最新进展吧。

如果你想在kubernetes集群中运行Spark任务,那么你可能会对:如何在k8s上运行external-shuffle-service感兴趣。把Driver和Executor都当做容器,丢到k8s上(k8s集群则把他们当做一般的容器,和其他业务类app一样对待),这种模式,可以使得集群资源池归一,避免Spark一个资源池,业务类(K8S)集群一个资源池。提升整体资源利用率,统一维护也降低运维成本。这也是Spark官方在2.3版本后为什么要支持Spark-on-k8s的主要驱动力。

1      external-shuffle-service作用

如果想要executor数量可以动态变化,就需要依赖external-shuffle-service功能(注意这句话,因为在k8s集群中,容器启动关闭很方便。所以非常希望executor数量可以动态调整,提升资源利用率)。

原因是在shuffle过程中,一个executor会到另一个executor那里取数据。如果一个executor节点挂掉了,那么它也就无法处理其他executor发过来的 shuffle 的数据读取请求了,它之前生成的数据都没有意义了。为了解决“取shuffle数据”,和“目标executor是否运行”分开。Spark引入了external-shuffle-service服务。相当于先把shuffle数据暂存到external-shuffle-service那里,然后大家去external-shuffle-service那里取就行了(有点像个中介)。

好文参考:https://zhmin.github.io/2019/08/05/spark-external-shuffle-service/

2      原来怎么部署

在原Spark框架中,external-shuffle-service是部署在每个节点上的。

(1)executor 告诉 external-shuffle-service 数据存放在哪里,然后(2) external-shuffle-service 记下来,供别人查询。所以问题的关键是,数据放“哪里”支持哪些格式呢。我们看(1)里面通知是结构是长这样:

public class RegisterExecutor extends BlockTransferMessage {public final String appId;         // spark application idpublic final String execId;        // executor idpublic final ExecutorShuffleInfo executorInfo;    // 《==文件路径
}

可以看出来,关键在 “在哪里” 要看(2)长什么样:

public class ExecutorShuffleInfo implements Encodable {public final String[] localDirs;         // 《== 第一级目录列表public final int subDirsPerLocalDir;     // 第二级目录列表public final String shuffleManager;      // shuffleManager的类型,目前只有一种类型 SortShuffleManager}

可以看到,这个shuffle数据 “在哪里” 只能支持HostPath(本地路径)。

问题的关键就来了:executor容器跑在k8s节点上面,external-shuffle-service跑在另一个容器里面。要想共享相同Path文件,那就必须使用节点路径(k8s-hostpath)。要用这个Hostpath 还得拥有节点的所有权,这个对于多用户共享的K8s集群来说,权限不安全,数据未隔离。

3      在k8s上要怎么解决(一)

Spark的external-shuffle-service要怎么在k8s上运行,这是个问题。Spark社区关于这个有个讨论:https://docs.google.com/document/d/1uCkzGGVG17oGC6BJ75TpzLAZNorvrAU3FRd2X-rVHSM/edit#heading=h.btqugnmt2h40

这个文档主要是说:

当前external-shuffle-service的实现有缺点:(1)多个Spark应用共用一个external-shuffle-service,如果external-shuffle-service出问题,多个Spark应用都受影响,即隔离性差。(2)一个节点一个external-shuffle-service,导致不同节点间压力不均衡。同时如果节点挂了,external-shuffle-service也就没了,这个节点上面的所有executor都受影响,可靠性差。(3)在当前较火热的Docker容器环境下,executor写入的shuffle数据(在一个容器内)。不一定就能被external-shuffle-service读取到(在另一个容器内)。因为有些k8s集群中,管理员出于安全考虑,会强制隔离不同用户的容器,禁止任何共享。

所以提出了改进方向:即executor保存shuffle数据时,不限定非得是保存在本地Path中。

具体实现方案可以有多种。

(1)       保存shuffle数据时,通过external-shuffle-service上传的方式。

(2)       external-shuffle-service支持shuffle数据为远端uri地址,而不仅仅是主机路径。

(3)       由Driver来维护所有的shuffle数据信息,取消external-shuffle-service组件。

(4)       将shuffle数据保存到分布式存储中。

(5)       将shuffle数据上传到external-shuffle-service,然后由Driver跟踪文件路径。

总体思路就是:以前external-shuffle-service是本地写,远程读。调整为:远程写,远程读。

4      在k8s上要怎么解决(二)

其实要在k8s上实现executor数量动态调整(dynamic resource allocation),还有另一条小路(即不通过external-shuffle-service的方式)。并且这条路已经实现了,在这个PR里面。https://github.com/apache/spark/pull/24817

Ø  实现原理:

当发现executor里面是shuffle数据没有用了,则可以删除该executor。如果这个executor里面的shuffle数据,还会被其他Jop读取,那么就保持这个executor存活着不被删除。从而实现executor数量可以动态调整。

Ø  缺点:

可以看出来,这种方式其实是一种缓兵之计。(1)删除部分暂时不被使用executor,但是必须保留那些还会被使用的executor。所以动态效果并不是最优的。另外,(2)一个executor也许最近不被使用,被删除了。但是后续其他Stage又有可能去访问那个shuffle数据。结果发现找不到(被动态删除嘛),这个时候又得重新计算,浪费性能。

PR里面的讨论也说了,这个是无法用来完整替代external-shuffle-service的。

5      路标计划

通过上面的分析,基本了解了在k8s上面跑external-shuffle-service的困难和思路。

所以要达到目的的路径为:(1)external-shuffle-service支持远端保存shuffle数据。(2)executor和external-shuffle-service共享云端shuffle数据。(3)executor数量可以动态调整,不影响功能。(4)在k8s上支持了executor数量动态调整(dynamic resource allocation)。

看Spark的规划是在 3.0.0 版本提供完整能力,嗯,让我们期待Spark on K8s越来越溜吧。

https://issues.apache.org/jira/browse/SPARK-24432

作者:tsjsdbd

【华为云技术分享】快速理解spark-on-k8s中的external-shuffle-service相关推荐

  1. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  2. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  3. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  4. 【华为云技术分享】如何快速实现鲲鹏弹性云服务器Node.js部署和高可用性?

    "Node 开发者容易面临的前三大困惑分别是异步编程.事件驱动以及 Debug.同时,文档是大家最期待的资源,新人对视频教程和免费在线课程的呼声最高."这份<2020 年 N ...

  5. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  6. 【华为云技术分享】浅谈产品模型(Profile)在程序设计中的作用

    引言:物联网平台的一个重要功能就是资产管理,产品或者设备都可以看成是资产中组成部分,所有有时候说物联网平台可以进行产品管理和设备管理.通常应用物联网平台开发一套具有产品或者设备管理功能的系统的时候,必 ...

  7. 【华为云技术分享】降本增效的背后:华为云瑶光数字化经营实战

    引言:华为云瑶光(Alkaid)作为面向云.AI.5G时代的分布式云操作系统,承载未来"分布式.确定性.多维智慧"的云,致力于打造"极优.极简"的云上体验. 根 ...

  8. 【华为云技术分享】从自建MongoDB聊聊云数据库MongoDB的蓬勃张力

    在很长一段时间内,企业为了自身发展大多选择自建数据库,而随着企业的发展壮大和数据量的猛增,自建数据库越来越不能满足企业对数据库提出的高要求,为了更好地管理和使用海量数据,越来越多企业选择把云下数据库迁 ...

  9. 【华为云技术分享】Spark如何与深度学习框架协作,处理非结构化数据

    随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...

最新文章

  1. matlab 自定义对象,面向对象:MATLAB的自定义类 [MATLAB]
  2. VS中 无法创建虚拟目录 本地IIS IIS Express 外部主机
  3. python申请内存函数_Python Ctypes c函数的内存分配
  4. MySQL数据库优化技巧(二)
  5. 自然哲学的数学原理_物理起源点,牛顿《自然哲学的数学原理》
  6. 计算机无法打开策略,Win10提示“无法打开此计算机上的组策略对象”如何解决...
  7. 【Pytorch神经网络理论篇】 33 基于图片内容处理的机器视觉:目标检测+图片分割+非极大值抑制+Mask R-CNN模型
  8. java读写html文件时出现中文乱码问题的解决方法
  9. 「leetcode」1207. 独一无二的出现次数:【数组在哈希法中的经典应用】详解
  10. 辞职信格式模板和范文参考
  11. 智能消防栓监控系统解决方案
  12. python0不能做除数报错_浅谈pandas dataframe对除数是零的处理
  13. c语言小游戏——弹跳的小球和简单的飞机游戏
  14. blob的txt下载方式
  15. chi2inv函数 matlab_matlab函数与指令大全 a——h (转载)
  16. 计算机机房的安全知识有哪些,计算机公共机房安全管理制度
  17. MVC4 AspNet MVC下的Ajax / 使用JQuery做相关的Ajax请求
  18. 004--自找麻烦之 vue2.0
  19. 软件工程 结对编程1
  20. 浪潮服务器性能参数,浪潮高密度服务器i24

热门文章

  1. java 随机手机验证码_基于Java随机生成手机短信验证码的实例代码|chu
  2. flutter和webapp_Flutter 适配移动端和web不同尺寸
  3. 软考5个高级中哪个好考_请问:计算机软考中、高级,哪个好考些呢?
  4. 无符号数和有符号数之间赋值和大小比较
  5. more指令和less指令使用的区别
  6. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何修改某个轴的数值单位
  7. Leaflet使用vector tiles 标注label设置
  8. 校外分散实习(14)
  9. ApplePay支付使用
  10. 读《编程珠玑》 (四)