写点什么

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

  • 2020-10-31
  • 本文字数:2681 字

    阅读完需:约 9 分钟

存算分离下写性能提升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 的存储性能对比。


回到我们想解决的问题中来,先来看一组测试数据,基于 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) 产品研发团队近期的重要目标,欢迎大家一起交流探讨相关问题。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接


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


2020-10-31 10:002655

评论

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

黑龙江等保测评的核心流程

等保测评

Web3 软件系统的开发框架

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

京东图片搜索商品API指南

tbapi

京东API 京东图片搜索接口 京东拍立淘接口 京东以图搜索接口 京东图搜API

TRAE 新增自定义模型服务商、进程资源管理器,国际版支持银联支付!

火山引擎开发者社区

Trae

畅连啦!华为开发者空间云开发环境惊喜上线

华为云开发者联盟

webgl开发框架及特点

北京木奇移动技术有限公司

数字孪生 软件外包公司 webgl开发

对话|Data Agent:企业首位AI数据专家如何颠覆传统分析?

火山引擎开发者社区

AI

大庆等保测评周期与复测要求解析

等保测评

从谨慎检查到一键接受,TRAE 如何成为我的主力 IDE?

火山引擎开发者社区

Trae

炸了!AWS 推出 S3 Vectors

AI数据云Relyt

AI AWS 向量数据库 LLM

轻松上手|用 TRAE + Context7 MCP Server 创建代码助手智能体

火山引擎开发者社区

Trae

GreatSQL函数索引失效分析:排序规则匹配机制

GreatSQL

数据分析与AI丨如何选择合适的知识图谱软件,CTO/CIO 必问10个关键点

Altair RapidMiner

人工智能 AI 数据分析 汽车 数字孪生

Ubuntu 22.04系统KWDB数据库安装部署使用教程_案例传感器

KaiwuDB

京东商品评论API指南

tbapi

京东API 京东商品评论API 京东评论API 京东商品评论数据采集 京东评论数据采集

远程踏勘系统(源码+文档+讲解+演示)

深圳亥时科技

智能查重防串标:筑牢烟草行业招投标诚信“防火墙”

中烟创新

就在今天,来开源生态大会和 KWDB 一起「玩转开源」!

KaiwuDB

中烟创新数字档案:开启烟草行业“智”理新动能

中烟创新

Perplexity CEO专访:AI浏览器大战、挑战谷歌以及广告模式的终结

AI数据云Relyt

openai ChatGPT LLM AIAgent AI浏览器

回收站的照片被删除了怎么找回?回收站被清空了还能恢复文件吗?

阿拉灯神丁

EasyRecovery 文件恢复 照片恢复 数据恢复软件 备份 & 恢复

AI大模型接口调用流程优化

北京木奇移动技术有限公司

AI大模型 AI教育 软件外包公司

[鸿蒙征文] HarmonyOS NEXT 语音播报 Demo:零门槛上手,小白也能秒启动

三掌柜

鸿蒙 HarmonyOS HarmonyOS NEXT 实践分享

百度智能云国产万卡集群率先通过信通院测评,获“五星级”评级

科技热闻

QT客户端开发框架及特点

北京木奇移动技术有限公司

软件外包公司 QT开发 QT客户端开发

他来了!她来了!CodeBuddy IDE 首发!首批限时内测开启,速来尝鲜!

六月的雨在InfoQ

CodeBuddyIDE AIIDE

【超实用】苹果电脑无法往U盘里存东西怎么办?Mac文件无法拷贝进U盘怎么解决?

阿拉灯神丁

NTFS 磁盘管理器 Tuxera NTFS2024 Mac磁盘管理 磁盘格式读写软件

大数据-49 Redis 缓存异常全攻略:穿透、击穿、雪崩、热Key、大Key通杀指南

武子康

Java redis 大数据 缓存 分布式

等保测评的行业适用性与案例分析

等保测评

KWDB 2.2.2 版本发布,修复产品典型问题,优化系统性能和稳定性

KaiwuDB

从概念到场景化落地,灯塔低代码平台重构企业数字化生态

中烟创新

存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?_大数据_云加社区_InfoQ精选文章