专栏首页QQ大数据团队的专栏存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?

存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?

引言

随着大数据技术架构的演进,存储与计算分离的架构能更好的满足用户对降低数据存储成本,按需调度计算资源的诉求,正在成为越来越多人的选择。相较 HDFS,数据存储在对象存储上可以节约存储成本,但与此同时,对象存储对海量文件的写性能也会差很多。

腾讯云弹性 MapReduce(EMR) 是腾讯云的一个云端托管的弹性开源泛 Hadoop 服务,支持 Spark、Hbase、Presto、Flink、Druid 等大数据框架。

近期,在支持一位 EMR 客户时,遇到典型的存储计算分离应用场景。客户使用了 EMR 中的 Spark 组件作为计算引擎,数据存储在对象存储上。在帮助客户技术调优过程中,发现了 Spark 在海量文件场景下写入性能比较低,影响了架构的整体性能表现。

在深入分析和优化后,我们最终将写入性能大幅提升,特别是将写入对象存储的性能提升了 10 倍以上,加速了业务处理,获得了客户好评。

本篇文章将介绍在存储计算分离架构中,腾讯云 EMR Spark 计算引擎如何提升在海量文件场景下的写性能,希望与大家一同交流。文章作者:钟德艮,腾讯后台开发工程师。

一、问题背景

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,可用来构建大型的、低延迟的数据分析应用程序。Spark 是 UC Berkeley AMP lab (加州大学伯克利分校的 AMP 实验室)所开源的类 Hadoop MapReduce 的通用并行框架,Spark 拥有 Hadoop MapReduce 所具有的优点。

与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行,也可以运行在云存储之上。

在这次技术调优过程中,我们研究的计算引擎是 EMR 产品中的 Spark 组件,由于其优异的性能等优点,也成为越来越多的客户在大数据计算引擎的选择。

存储上,客户选择的是对象存储。在数据存储方面,对象存储拥有可靠,可扩展和更低成本等特性,相比 Hadoop 文件系统 HDFS,是更优的低成本存储方式。海量的温冷数据更适合放到对象存储上,以降低成本。

在 Hadoop 的生态中,原生的 HDFS 存储也是很多场景下必不可少的存储选择,所以我们也在下文加入了与 HDFS 的存储性能对比。另外我们也对比了腾讯云 CHDFS 提供的高可用高可靠的云端 HDFS 存储服务[1]。

回到我们想解决的问题中来,先来看一组测试数据,基于 Spark-2.x 引擎,使用 SparkSQL 分别对 HDFS、对象存储写入 5000 文件,分别统计执行时长:

从测试结果可以看出,写入对象存储耗时是写入 HDFS 的 29 倍,写入对象存储的性能要比写入 HDFS 要差很多。而我们观察数据写入过程,发现网络 IO 并不是瓶颈,所以需要深入剖析一下计算引擎数据输出的具体过程。

二、Spark数据输出过程剖析

1. Spark数据流

先通过下图理解一下 Spark 作业执行过程中数据流转的主要过程:

首先,每个 task 会将结果数据写入底层文件系统的临时目录 _temporary/task_[id],目录结果示意图如下所示:

到此为止,executor 上的 task 工作其实已经结束,接下来将交由 driver,将这些结果数据文件 move 到 hive 表最终所在的 location 目录下,共分三步操作:

第一步,调用 OutputCommiter 的 commitJob 方法做临时文件的转存和合并:

通过上面示意图可以看到,commitJob 会将 task_[id] 子目录下的所有数据文件 merge 到了上层目录 ext-10000。

接下来如果是 overwrite 覆盖写数据模式,会先将表或分区中已有的数据移动到 trash 回收站。

在完成上述操作后,会将第一步中合并好的数据文件,move 到 hive 表的 location,到此为止,所有数据操作完成。

2. 定位分析根因

有了上面对 Spark 数据流的分析,现在需要定位性能瓶颈在 driver 端还是 executor 端?观察作业在 executor 上的耗时:

发现作业在 executor 端执行时长差异不大,而总耗时却差异却非常大, 这说明作业主要耗时在 driver 端。

在 driver 端有 commitJob、trashFiles、moveFiles 三个操作阶段,具体是在 driver 的哪些阶段耗时比较长呢?

我们通过 spark-ui 观察 Thread dump (这里通过手动刷新 spark-ui 或者登录 driver 节点使用 jstack 命令查看线程堆栈信息),发现这三个阶段都比较慢, 下面我们来分析这三部分的源码。

3. 源码分析

(1)JobCommit阶段

Spark 使用的是Hadoop的FileOutputCommitter来处理文件合并操作, Hadoop 2.x 默认使用 mapreduce.fileoutputcommitter.algorithm.version=1,使用单线程 for 循环去遍历所有 task 子目录,然后做 merge path 操作,显然在输出文件很多情况下,这部分操作会非常耗时。

特别是对对象存储来说,rename 操作并不仅仅是修改元数据,还需要去 copy 数据到新文件。

(2)TrashFiles阶段

trashFiles 操作是单线程 for 循环来将文件 move 到文件回收站,如果需要被覆盖写的数据比较多,这步操作会非常慢。

(3)MoveFiles阶段

与前面问题类似,在 moveFiles 阶段也是采用了单线程 for 循环方式来 move 文件。

4. 问题小结

  • Spark 引擎写海量文件性能瓶颈在Driver端;
  • 在 Driver 的 CommitJob、TrashFiles、MoveFiles 三个阶段执行耗时都比较长;
  • 三个阶段耗时长的原因都是因为单线程循环挨个处理文件;
  • 对象存储的 rename 性能需要拷贝数据,性能较差,导致写海量文件时耗时特别长。 

三、优化结果

可以看到社区版本大数据计算引擎在处理对象存储的访问上还在一定的性能问题,主要原因是大多数数据平台都是基于 HDFS 存储,而 HDFS 对文件的 rename 只需要在 namenode 上修改元数据,这个操作是非常快的,不容易碰到性能瓶颈。

而目前数据上云、存算分离是企业降低成本的重要考量,所以我们分别尝试将 commitJob、trashFiles、moveFile 代码修改成多线程并行处理文件,提升对文件写操作性能。

基于同样的基准测试,使用 SparkSQL 分别对 HDFS、对象存储写入 5000 个文件,我们得到了优化后的结果如下图所示:

最终写 HDFS 性能提升 41%,写对象存储性能提升 1100% !

四、结语

从上述的分析过程看到,问题的关键是 Spark 引擎某些处理部分的单线程限制造成的。单线程限制其实是比较常见的技术瓶颈。虽然我们在一开始也有猜测这种可能性,但具体限制在哪一部分还需要理清思路,踏实的查看源代码和多次调试。

另外分析中也发现了对象存储自身的限制,其 rename 性能需要拷贝数据,导致写海量文件耗时长,我们也还在持续进行改进。

对存储计算分离应用场景深入优化,提升性能,更好的满足客户对存储计算分离场景下降本增效的需求,是我们腾讯云弹性 MapReduce(EMR) 产品研发团队近期的重要目标,欢迎大家一起交流探讨相关问题。

参考资料:

[1] 腾讯云HDFS存储服务:

https://cloud.tencent.com/document/product/1105/36355

点击文末「阅读原文」,了解腾讯云弹性 MapReduce更多信息~

腾讯云大数据

长按二维码 关注我们

本文分享自微信公众号 - 腾讯云大数据(TXcloudbigdata),作者:钟德艮

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Quicksilver快数据处理系统

    | 导语 Quicksilver为神盾推出的一款推荐场景下数据快速处理系统,旨在解决数据如何在分钟级、秒级更新并对接线上。 背景 随着神盾推荐业务场景的不断深...

    腾讯QQ大数据
  • 海量短文本场景下的去重算法

    在大多数情况下,大量的重复文本一般不会是什么好事情,比如互相抄袭的新闻,群发的垃圾短信,铺天盖地的广告文案等,这些都会造成网络内容的同质化并加重数据库的存储负担...

    腾讯QQ大数据
  • 持续引领大数据行业发展,腾讯云发布全链路数据开发平台WeData

    9月11日,在腾讯全球数字生态大会大数据专场上,腾讯云大数据产品副总经理雷小平重磅发布了全链路数据开发平台WeData,同时发布和升级了流计算服务、云数据仓库...

    腾讯QQ大数据
  • 存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?

    随着大数据技术架构的演进,存储与计算分离的架构能更好的满足用户对降低数据存储成本,按需调度计算资源的诉求,正在成为越来越多人的选择。相较 HDFS,数据存储在对...

    腾小云
  • win10 uwp 使用 AppCenter 自动构建

    微软在今年7月上线 appcenter.ms 这个网站,通过 App Center 可以自动对数千种设备进行适配测试、快速将应用发送给测试者或者直接发布到应用商...

    林德熙
  • 对象存储来势汹汹,究竟谁是“幕后推手”?

    存储圈真会玩,继网络接入存储、块存储、文件存储之后,对象存储也掀起了新一轮发展浪潮。银行、保险、交通集团等传统企业纷纷换上了对象存储,真怀疑IT部门的单身狗只是...

    数据猿
  • 最火的Android开源项目整理

    一、代码库 1、from  代码家 整理比较好的源码连接 ***************************************************...

    庞小明
  • 重磅!ERA5出1979年以前的数据了!

    就在刚刚,EC官网更新了ERA5数据集及相关介绍,增加了ERA5(1950-1978年,第一版)。

    郭好奇同学
  • 中移动分布式存储超级大单出炉,浪潮等唱主角

    近日,中国移动公布了2019年至2020年分布式块存储产品集中采购招标公告。自2017年以来,中国移动已经组织了两次分布式文件存储集采,本次集采是电信运营商行业...

    大数据在线
  • 云存储的成本可能是模糊的

    云存储服务提供便利,可以减少IT支出,但并非所有情况都如此。企业在确定将关键数据放入云计算之前务必先进行数学运算。 ? 如果有人相信平常所看到的IT内容,可能...

    静一

扫码关注云+社区

领取腾讯云代金券