写点什么

Spark on K8s :提升集群资源利用率的方法我也有

  • 2019 年 11 月 20 日
  • 本文字数:2432 字

    阅读完需:约 8 分钟

Spark on K8s :提升集群资源利用率的方法我也有

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 的主要驱动力。


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 那里取就行了(类似于中介)。


更多运行原理请见


原来怎么部署

在原 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 id  public final String execId;  // executor id   public 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 集群来说,权限不安全,数据未隔离。


在 K8s 上如何解决

Spark 的 external-shuffle-service 要怎么在 K8s 上运行,这是个问题。


[Spark 社区关于这个有个讨论:]


这个文档主要是表达当前 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 是本地写,远程读,调整为远程写,远程读


其实要在 K8s 上实现 executor 数量动态调整(dynamic resource allocation),还有另一条小路(即不通过 external-shuffle-service 的方式)。并且这条路已经实现了,在如下PR里


实现原理:


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


缺点:


可以看出,这种方式其实是缓兵之计。


  • 删除部分暂时不被使用 executor,但是必须保留那些还会被使用的 executor。所以动态效果并不是最优的。

  • 一个 executor 也许最近不被使用,被删除了。但是后续其他 Stage 又有可能去访问那个 shuffle 数据。结果发现找不到(被动态删除嘛),这个时候又得重新计算,浪费性能。


PR 里面的讨论也表示这是无法用来完整替代 external-shuffle-service 的。


社区路标

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


所以要达到目的的路径为:


  • external-shuffle-service 支持远端保存 shuffle 数据

  • executor 和 external-shuffle-service 共享云端 shuffle 数据

  • executor 数量可以动态调整,不影响功能

  • 在 K8s 上支持了 executor 数量动态调整(dynamic resource allocation)。


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



添加小助手微信,加入【容器魔方】技术社群。



2019 年 11 月 20 日 19:291300

评论

发布
暂无评论
发现更多内容

Java程序员必备框架—Spring全家桶的前世今生详细梳理

北游学Java

Java spring

Using side features: feature preprocessing

毛显新

自然语言处理 深度学习 tensorflow 推荐系统 keras

瞥一瞥AI,撩一撩算法

博文视点Broadview

如何在二三线城市月薪过万(一)看完这篇后端简历优化,包你面试不断

小鲍侃java

面试 后端

泰国Ascend Money用开源软件加快应用交付

WorkPlus Lite

阅读

INFRA-JOY微服务治理验证工程实践分享

徐敏

微服务 自动化测试 全链路压测 性能压测

WorkPlus高端制造业数字化解决方案—科达洁能

WorkPlus Lite

开源 企业 解决方案 即时通讯

区块链去中心化钱包开发|开发去中心化钱包

Geek_23f0c3

钱包系统开发 去中心化交易所系统开发 去中心化钱包 去中心化交易所

手把手体验远程开发,确实爽

程序员鱼皮

Java Python 软件 大前端 后端

WorkPlus高端制造业数字化解决方案—首发集团

WorkPlus Lite

开源 企业 即时通讯 移动开发

坐下来谈谈如何写好一份简历?

童欧巴

面试 大前端 简历

详解Camtasia的PPT录制功能

淋雨

视频剪辑 Camtasia 录屏软件

大数据实战训练营Hbase作业

Clarke

模块三

Winston

带你走进“华为链”

华为云开发者社区

区块链 高性能 华为链 自研区块链平台 自主可控

第三届WICC北京落幕 展现开发者服务生态与建设新方向

融云 RongCloud

小白必看,通俗易懂的LockSupport

程序猿阿星

Java并发 线程协作 LockSupport 线程间通信

1.6W字!梳理50道经典计算机网络面试题(收藏版)

互联网架构师小马

大厂面试真题——Netty/IO篇,你能答上来几道?

Java架构师迁哥

AI论文解读丨融合视觉、语义、关系多模态信息的文档版面分析架构VSR

华为云开发者社区

语义 视觉 多模态信息 文档版式 VSR

Java集合源码总结分析

剖根问底:Java 不能实现真正泛型的原因是什么?

沉默王二

java

中易通科技禾禾实验室产品培育田

叶落便知秋

3D地图与3D柱状图联合使用

森友小锘

大前端 地图 可视化 数字孪生

兰宝环保 | 新体系“行动计划”中化工制药行业VOCs废气治理要点

叶落便知秋

云图说 | 华为云医疗智能体,智联大健康,AI药物研发

华为云开发者社区

AI 药物研发 医疗智能体

CloudQuery 首次开放API,v1.4.1将开放「部门导入」和「用户导入」

CloudQuery社区

数据库 OpenAPI 数据库管控

男人要慢,SQL要快:记一次慢SQL优化

艾小仙

数据对AI的重要性:采访首席数据官Rick McFarland - LexisNexis Legal & Professional

WorkPlus Lite

阅读

TensorFlow Recommenders: Quickstart

毛显新

深度学习 tensorflow 推荐系统 keras

以两种异步模型应用案例,深度解析Future接口

华为云开发者社区

Java 模型 异步 FutureTask Future接口

Spark on K8s :提升集群资源利用率的方法我也有_文化 & 方法_华为云原生团队_InfoQ精选文章