降本增效利器!趣头条Spark Remote Shuffle S

2020-12-08  本文已影响0人  阿里云云栖号

简介:趣头条是一家依赖大数据的科技公司,在2018-2019年经历了业务的高速发展,主App和其他创新App的日活增加了10倍以上,相应的大数据系统也从最初的100台机器增加到了千台规模。面对业务和数据的日益增长,如何优化大数据平台,真正实现降本增效,技术人也面临着非常大的挑战,近半年趣头条和阿里云一起合作,通过Spark Remote Shuffle Service取得了较大的进展,在这里大家可以更加详细地了解这套方案。

1. 业务场景与现状

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

image

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

2. 当前大数据平台的挑战与思考

近半年大数据平台主要的业务指标是降本增效,一方面业务方希望离线平台每天能够承载更多的作业,另一方面我们自身有降本的需求,如何在降本的前提下支撑更多地业务量对于每个技术人都是非常大地挑战。熟悉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基础组件。

3. 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。

image

图2 RSS整体架构图

3.2.2 实现流程

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

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

3.2.3 容错

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

3.2.4 高可用

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

4. 实际效果与分析

4.1 性能与稳定性

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

image

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

image

图4 实际业务的作业stage图(使用RSS保障稳定性和性能)

4.2 业务效果

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

5. 未来展望

趣头条大数据平台和阿里云EMR团队后续会继续保持深入共创,将探索更多的方向。主要有以下的一些思路:

作者:王振、曹佳清、范振

原文链接

本文为阿里云原创内容,未经允许不得转载

上一篇 下一篇

猜你喜欢

热点阅读