如何进行EMR Spark-SQL性能极致优化的分析

这篇文章将为大家详细讲解有关如何进行EMR Spark-SQL性能极致优化的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

第三次刷榜的 Flag

从上述的 TPCDS Perf 链接中,我们可以看到,其实 EMR 团队在 10TB 规模总共提交了三次成绩。第三次也就是这一次打榜,背后还有一个小故事。因为在 Perf 页面中,最终 TPCDS 关注的指标有两个,一个是性能指标一个是性价比指标。这次项目立项的时候,我们就给自己立下了一个艰难的 Flag ,我们要在物理硬件保持不变的条件下,纯靠软件优化提升 2 倍+,这样子性能指标和性价比指标就都能翻倍了。

与开源 Spark 版本的一些对比数据

在提交完成绩后,我们用开源 Spark V2.4.3 版本进行了 TPCDS 99 Query 测试,以下是性能数据对比

Load 阶段性能提升约 3 X

如何进行EMR Spark-SQL性能极致优化的分析

PT 阶段性能提升约 6 X

如何进行EMR Spark-SQL性能极致优化的分析

PS. 其中社区 Spark V2.4.3 版本中 Query 14 以及 Query 95 因为 OOM 的原因没法跑出来,不纳入计算

社区 Spark 版本运行时间大于 200S 的 Query 单独拿出来对比

如何进行EMR Spark-SQL性能极致优化的分析

PS. 这几个 Query 最低的 Query 78 有 3X 性能提升,Query 57有接近 100 倍的性能提升。

优化点概述

优化器

  • 基于 InMemoryTable Cache 的 CTE 物化

简单来说,就是尽量更合理的利用 InMemoryTable Cache 去减少不必要的重复计算,比如说 Query 23A/B 中的标量计算,本身是非常重的操作,并且又必须重复的计算,通过 CTE 优化的模式匹配,识别出需要重复计算且比较耗时的操作,并利用 InMemoryTable 缓存,整体减少 E2E 时间

  • 更加有效的 Filter 相关优化

    • Dynamic Partition Pruning 这个在社区最新的3.0版本才有这个功能

    • 小表广播复用 一个具有过滤性的小表,如果可以过滤 2 个或以上的打表数据时,可以复用该小表的过滤效果 Query 64 就是一个好例子

    • BloomFilter before SMJ 在 SMJ 真正实施之前,通过前置 BloomFilter ,Join 过程的数据进一步减少,最大限度的消除 SpillDisk 的问题

  • PK/FK Constraint 优化 通过主键外键信息,对优化器提供更多的优化建议

    • RI-Join 去除 事实表与维表于主键外键上做 Join ,但是维表的列并没有被 Project 的情况下,这次 Join 其实完全没有必要执行

    • GroupBy Keys 去除非主键列 当GroupBy Keys 中同时包括主键列以及非主键列,其实非主键列对 GroupBy 结果已经没有影响了,因为主键列已经隐含了 Unique 的信息

    • GroupBy Push Down before Join

  • Fast Decimal

基于 Table Analyze 以及运行时中的 Stat 信息,优化器可以决定把某些 Decimal 优化为 Long 或者 Int 的计算,这会有极大的提升,而 TPCDS 99 Query 里有大量的 Decimal 计算

运行时

这次的优化里面,还有一个很好玩的优化,就是我们引入的 Native Runtime,如果说上述的优化器优化都是一些特殊 Case 的杀手锏,Native Runtime 就是一个广谱大杀器,根据我们后期统计,引入 Native Runtime,可以普适性的提高 SQL Query 15~20%的 E2E 耗时,这个在TPCDS Perf 里面也是一个很大的性能提升点。

大致的介绍一下 Native Runtime
基于开源版本的 WholeStageCodeGeneration 的框架,在原有的生成的 Java 代码,替换成 Weld IR 来真实运行。在整个项目里,Weld IR 的替换其实是非常小的一部分工作,为了Weld IR 能够运行起来,我们还需要做以下的工作

  • Expression Weld IR CodeGen ( TPCDS 范围内全支持)

  • Operators Weld IR CodeGen (除了 SortMergeJoin 用 C++ 实现,其他均可以用 Weld IR 代替)

  • 统一内存布局 (OffHeap UnsafeRow => C++ & Weld Runtime)

  • Batch 化执行框架 (因为如果按照 Java 运行时,每次都是一条记录的在生成代码里流转,在 NativeRuntime 的时间里代价太高, JNI 以及WeldRuntime 明显不能这么玩)

  • 其他高性能Native算子 SortMergeJoin、PartitionBy、CSV Parsing,这几个算子目前用 Weld IR 提供的接口无法直接实现,我们通过 C++来实现这些算子的 Native 执行

关于如何进行EMR Spark-SQL性能极致优化的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.SparkStreaming是什么?SparkStreaming是SparkCore的扩展API用来支持高吞吐、高容错的处理流式数据数据源可以是:Kafka、TCPsockets、Flume、Twitter等流式数据源处理数据:可以用SparkCore的算子map、reduce、join、window
本篇内容介绍了“Spark通讯录相似度计算怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
本篇文章给大家分享的是有关如何进行Spark数据分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说...
本篇内容主要讲解“Spark Shuffle和Hadoop Shuffle有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“S...
这篇文章主要介绍“TSDB的数据怎么利用Hadoop/spark集群做数据分析”,在日常操作中,相信很多人在TSDB的数据怎么利用Hadoop/spark集群做数据分析问题上存在疑惑...
本篇内容介绍了“Hadoop与Spark性能原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这
小编给大家分享一下Hadoop和Spark有什么不同,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们
这篇文章主要讲解了“Hadoop和Spark的Shuffle过程有什么不同”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习...
本篇文章给大家分享的是有关基于CDP7.1.1的Spark3.0技术预览版本分析是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍“Spark中foreachRDD、foreachPartition和foreach的区别是什么”,在日常操作中,相信很多人在Spark中foreachRDD、foreachPartition和foreach的...
本篇内容主要讲解“spark的动态分区裁剪怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spark的动态分...
本篇内容介绍了“spark的动态分区裁剪下物理计划怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下
这篇文章给大家介绍基于Spark和TensorFlow 的机器学习实践是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。EMR E-Learning平台...
这篇文章将为大家详细讲解有关如何进行EMR Spark-SQL性能极致优化的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识...
如何进行SparkSQL与Hive metastore Parquet转换的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决...
如何浅析Hive和Spark SQL读文件时的输入任务划分,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个...
这篇文章将为大家详细讲解有关Hive on Spark参数如何调优,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言Hive on Spa...
这篇文章将为大家详细讲解有关fs.defaultFS变更使spark-sql查询hive失败是怎么回事,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以...
这篇文章将为大家详细讲解有关怎么解析SparkCore和SparkSQL,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解...
怎么快速搭建Spark开发环境,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一,搭建本...