Zeus: Uber 开发的分布式的高扩展 Shuffle 服务组件
发布日期:2021-06-30 11:30:03 浏览次数:2 分类:技术文章

本文共 2286 字,大约阅读时间需要 7 分钟。

本文来自  Spark Summit North America 2020,由 Uber 的工程师分享的标题为 《Zeus: Uber’s Highly Scalable and Distributed Shuffle as a Service》的议题。相关视频可以参见过往记忆大数据之前发的 ,获取PPT 请关注公众号「 Java技术范」 ,并回复 zeus 获取。

Uber 作为全球性的一家公司,到目前完成了150亿次旅行订单,到目前每天1800万人次旅行订单。覆盖六大洲,69个国家和10000个城市,1.03亿月活跃用户,500万活跃的司机,全球22000名员工,其中包含3700名开发者。

数据和机器学习算法是 Uber 的基石,在 Uber 里面有大量的数据和 ML 相关的场景,主要包括以下这些:

由于时间的限制,这次分享主要挑几个主要的介绍。其中一个就是 ETAs(预计到达时间),ETAs 是 Uber 一个非常重要的案例。

下面一些是其他的场景

下面是 Uber 的大数据技术栈

可以看到,基本上和其他公司的大数据技术栈大同小异。下面是 Uber 的 ML 技术栈。

Uber Apache Spark 使用情况

在 Uber,Apache Spark 是主要的分析执行引擎。

•95% 的批处理和 ML 作业在 Spark 上运行•Spark 是运行在 YARN 和 Peloton/Mesos 上•Spark 的 Shuffle 数据是使用外部 Shuffle 服务的

下图是 Apache Spark Shuffle 服务工作原理:Spark 的 Mapper 端把数据写到本地磁盘,并且按照分区分组好写到同一个文件中;同时在另外一个文件里面维持对应的索引。Reduce 端通过 Shuffle Reader 访问 Mapper 端的 Local Shuffle Service 获取其对应的分区数据。在 Reduce 端根据数据量的大小可能会把数据 Spill 到

 Apache Spark Shuffle 服务的极限:

•可能耗尽 SDD 的磁盘空间

•可靠性问题•Kubernetes 动态分配

针对上面的问题,有很多不同的应对方法:

方法一:把 Shuffle 的数据写到外部存储系统。

比如同步写到 NFS 上,但是性能会慢2倍;同步写到 HDFS 上,性能会慢5倍。

如果是半异步写,HDFS慢4倍左右

方法二:使用远程 Shuffle 服务。

•流式的方式写到 HDFS 上,这个会比直接写到本地存储慢 1.5 倍;

•流式的方式写到本地,和 external shuffle service 性能类似。

流式的方式写到本地存储,这种方式改变了 MapReduce 的模式,流程主要为 Record Stream -> Shuffle Server -> Disk,好处是在 Executor 端没有临时的 spill 文件。

下图就是远程 Spark Shuffle 服务的架构

深入了解远程 Shuffle 服务

Zeus 设计原理

•能够水平扩展。每个服务实例都独立工作;避免中心化的状态或者存储;•解决网络延迟。主要包括减少服务器响应的等待时间以及流式数据的写法;•性能优化。Uber 内部大多数 Spark 应用程序已针对性进行了性能优化;同时,性能优化依靠了 YARN / Apache Spark 的重试进行故障恢复

下面分别对这三方面进行详细的介绍。

水平扩展

水平扩展主要包括以下方面

•Spark应用程序共享或者使用不同的 shuffle servers•Shuffle 服务器之间没有共享状态•Shuffle 服务器可扩展

下面是一个 Shuffle 服务的分布式架构图

假设我们的 Mapper 个数为 m, Reduce 个数为 r,Shuffle 服务器的个数为 s,那么 Mapper 的网络连接数为 m * s;Reduce 的网络连接数为 r。

网络延迟

网络延迟解决主要包括服务器端使用了 Netty,两个线程组以及二进制网络协议。

还包括直接读写磁盘文件。比如直接将数据写到 OS 文件;使用零复制技术;顺序读写。

客户端使用到压缩

并行系列化和网络 IO

访问连接池

性能优化

性能方面主要包括异步 Shuffle 数据提交

Zeus 容错实现

Zeus 的 Shuffle 服务发现和健康检测使用到了 Zookeeper。

同时 Shuffle 数据进行了复制。

Zeus 生产使用

Zeus 和开源的 Apache Spark 兼容。可以直接通过 Shuffle 插件机制来启用。

Zeus 的监控使用了 Uber 开源的  M3 metrics library。核心的监控指标包括网络连接数、文件描述符数以及磁盘利用率。

测试策略主要包括单元测试、随机测试以及生产查询抽样。

下面是 Uber 内部 Zeus 的生产情况:

•在生产环境使用了八个多月;

•每天承载数千个应用程序;•作业延迟与 external shuffle 相当;•马上将开源

Zeus 的展望如下

•支持所有的 Spark 工作负载,包括 Hive on Spark

•支持多租户;•支持负载均衡;•兼容 Spark Shuffle metadata API

好了,今天的分享到这里了,欢迎留言、分享、转载。

猜你喜欢

1、

2、

3、

4、

过往记忆大数据微信群,请添加微信:fangzhen0219,备注【进群】

转载地址:https://iteblog.blog.csdn.net/article/details/109324295 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:爬取了某个大数据专家的简历,终于知道自己差在哪里了
下一篇:Apache Spark 中支持的七种 Join 类型简介

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月25日 01时08分21秒