Spark Remote Shuffle Service最佳实践的示例分析

发布时间:2021-12-17 11:06:00 作者:柒染
来源:亿速云 阅读:221

这篇文章将为大家详细讲解有关Spark Remote Shuffle Service最佳实践的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

导读:
 

经过近半年的上线、运营,趣头条大数据团队和阿里云 EMR 团队共同开发的 RSS 可以完美解决 Spark Shuffle 面临的技术挑战,为集群的稳定性和容器化的落地提供强有力的保证,其业务价值主要体现在以下方面:


  • 降本增效效果明显

  • SLA显著提升

  • 作业执行效率显著提升

  • 架构灵活性显著提升




业务场景与现状 


 
趣头条是一家依赖大数据的科技公司,在2018-2019年经历了业务的高速发展,主App和其他创新App的日活增加了10倍以上,相应的大数据系统也从最初的100台机器增加到了1000台以上规模。多个业务线依赖于大数据平台展开业务,大数据系统的高效和稳定成了公司业务发展的基石,在大数据的架构上我们使用了业界成熟的方案,存储构建在HDFS上、计算资源调度依赖Yarn、表元数据使用Hive管理、用Spark进行计算,具体如图1所示:

 Spark Remote Shuffle Service最佳实践的示例分析  
 图1 趣头条离线大数据平台架构图  

其中Yarn集群使用了单一大集群的方案,HDFS使用了联邦的方案,同时基于成本因素,HDFS和Yarn服务在ECS上进行了DataNode和NodeManager的混部。  
 在趣头条每天有6W+的Spark任务跑在Yarn集群上,每天新增的Spark任务稳定在100左右,公司的迅速发展要求需求快速实现,积累了很多治理欠债,种种问题表现出来集群稳定性需要提升,其中Shuffle的稳定性越来越成为集群的桎梏,亟需解决。

当前大数据平台的挑战和思考  


近半年大数据平台主要的业务指标是降本增效,一方面业务方希望离线平台每天能够承载更多的作业,另一方面我们自身有降本的需求,如何在降本的前提下支撑更多地业务量对于每个技术人都是非常大地挑战。熟悉Spark的同学应该非常清楚,在大规模集群场景下,Spark Shuffle在实现上有比较大的缺陷,体现在以下的几个方面:

以上的这些问题对于Spark研发同学是非常痛苦的,好多作业每天运行时长方差会非常大,而且总有一些无法完成的作业,要么业务进行拆分,要么跑到独有的Yarn集群中。除了现有面临的挑战之外,我们也在积极构建下一代基础架构设施,随着云原生Kubernetes概念越来越火,Spark社区也提供了Spark on Kubernetes版本,相比较于Yarn来说,Kubernetes能够更好的利用云原生的弹性,提供更加丰富的运维、部署、隔离等特性。但是Spark on Kubernetes目前还存在很多问题没有解决,包括容器内的Shuffle方式、动态资源调度、调度性能有限等等。我们针对Kubernetes在趣头条的落地,主要有以下几个方面的需求:

因为趣头条的大数据业务目前全都部署在阿里云上,阿里云EMR团队和趣头条的大数据团队进行了深入技术共创,共同研发了Remote Shuffle Service(以下简称RSS),旨在解决Spark on Yarn层面提到的所有问题,并为Spark跑在Kubernetes上提供Shuffle基础组件。

Remote Shuffle Service设计与实现  


3.1 Remote Shuffle Service的背景
早在2019年初我们就关注到了社区已经有相应的讨论,如SPARK-25299  。该Issue主要希望解决的问题是在云原生环境下,Spark需要将Shuffle数据写出到远程的服务中。但是我们经过调研后发现Spark 3.0(之前的master分支)只支持了部分的接口,而没有对应的实现。该接口主要希望在现有的Shuffle代码框架下,将数据写到远程服务中。如果基于这种方式实现,比如直接将Shuffle以流的方式写入到HDFS或者Alluxio等高速内存系统,会有相当大的性能开销,趣头条也做了一些相应的工作,并进行了部分的Poc,性能与原版Spark Shuffle实现相差特别多,最差性能可下降3倍以上。同时我们也调研了一部分其他公司的实现方案,例如Facebook的Riffle方案以及LinkedIn开源的Magnet,这些实现方案是首先将Shuffle文件写到本地,然后在进行Merge或者Upload到远程的服务上,这和后续我们的Kubernetes架构是不兼容的,因为Kubernetes场景下,本地磁盘Hostpath或者LocalPV并不是一个必选项,而且也会存在隔离和权限的问题。

基于上述背景,我们与阿里云EMR团队共同开发了Remote Shuffle Service。RSS可以提供以下的能力,完美的解决了Spark Shuffle面临的技术挑战,为我们集群的稳定性和容器化的落地提供了强有力的保证,主要体现在以下几个方面:

3.2 Remote Shuffle Service的实现

3.2.1 整体设计

Spark RSS架构包含三个角色: Master, Worker, Client。Master和Worker构成服务端,Client以不侵入的方式集成到Spark ShuffleManager里(RssShuffleManager实现了ShuffleManager接口)。

整体流程如下所示(其中ResourceManager和MetaService是Master的组件),如图2。


Spark Remote Shuffle Service最佳实践的示例分析

      图2 RSS整体架构图

3.2.2 实现流程

下面重点来讲一下实现的流程:

总体来讲,RSS的设计要点总结为3个层面:

3.2.3 容错

对于RSS系统,容错性是至关重要的,我们分为以下几个维度来实现:

3.2.4 高可用

大家可以看到RSS的设计中Master是一个单点,虽然Master的负载很小,不会轻易地挂掉,但是这对于线上稳定性来说无疑是一个风险点。在项目的最初上线阶段,我们希望可以通过SubCluster的方式进行workaround,即通过部署多套RSS来承载不同的业务,这样即使RSS Master宕机,也只会影响有限的一部分业务。但是随着系统的深入使用,我们决定直面问题,引进高可用Master。主要的实现如下:

实际效果与分析  

4.1 性能与稳定性

团队针对TeraSort,TPC-DS以及大量的内部作业进行了测试,在Reduce阶段减少了随机读的开销,任务的稳定性和性能都有了大幅度提升。
图3是TeraSort的benchmark,以10T Terasort为例,Shuffle量压缩后大约5.6T。可以看出该量级的作业在RSS场景下,由于Shuffle read变为顺序读,性能会有大幅提升。


Spark Remote Shuffle Service最佳实践的示例分析
图3 TeraSort性能测试(RSS性能更好) 

图4是一个线上实际脱敏后的Shuffle heavy大作业,之前在混部集群中很小概率可以跑完,每天任务SLA不能按时达成,分析原因主要是由于大量的FetchFailed导致stage进行重算。使用RSS之后每天可以稳定的跑完,2.1T的shuffle也不会出现任何FetchFailed的场景。在更大的数据集性能和SLA表现都更为显著。
Spark Remote Shuffle Service最佳实践的示例分析
 图4 实际业务的作业stage图(使用RSS保障稳定性和性能

4.2 业务效果

在大数据团队和阿里云EMR团队的共同努力下,经过近半年的上线、运营RSS,以及和业务部门的长时间测试,业务价值主要体现在以下方面:

关于Spark Remote Shuffle Service最佳实践的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. 是时候学习真正的 spark 技术了
  2. 如何分析Spark Streaming的好处与坑

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

service

上一篇:fedora中​system-config-packages怎么安装使用

下一篇:python匿名函数怎么创建

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》