场景描述
面对大量的数据分析需求,提供一套高效、便捷的企业级查询分析服务至关重要。此次演讲介绍了字节跳动基于SparkSQL构建的大数据查询统一服务TQS(Toutiao Query Service)的实际应用情况,以及在执行计划调优、数据读取剪枝和SQL兼容性等方面的优化措施。
关键词
SparkSQL优化 字节跳动
目的和能力
该服务旨在为公司内外部提供Hive、Spark-SQL等OLAP查询引擎的支持。具体包括:
- 提供全公司大数据查询的一致服务入口,支持丰富的API接口,满足Adhoc、ETL等SQL查询需求。
- 支持多引擎的智能路由和参数的动态优化。
- 对Spark-SQL和Hive引擎的功能进行优化。
SparkSQL的优化措施
1. 执行计划自动调优
- 基于AE的ShuffledHashJoin调整:通过SparkAE(Spark Adaptive Execution)框架,根据shuffle数据量大小自动调整join执行计划,从SortMergeJoin调整为ShuffledHashJoin,以提高查询效率。
- Leftjoin build left map技术:在Left-join的情况下,将左表构建为HashMap,从而实现ShuffledHashJoin的调整。
2. 数据读取剪枝
- Parquet本地排序:对Parquet文件中的高频字段进行排序,以减少读取的数据量。
- Bloom Filter和BitMap:利用Bloom Filter和BitMap技术对数据进行过滤,进一步减少不必要的数据读取。
- Prewhere:在查询时,先根据条件对RowId进行过滤,再读取其他列的数据,减少IO操作和后续计算。
3. 其他优化措施
- Hive/Spark加载分区移动文件优化:通过调整staging目录位置,减少与NameNode的交互次数。
- Spark生成文件合并:通过添加一个repartition阶段来合并Spark生成的文件。
- Vcore技术:在CPU利用率较低的情况下,通过Vcore技术使一个YARN-core能够启动多个Spark-core。
- Spark访问Hive Metastore特定条件过滤:通过构造getpartitionsby_filter来实现cast、substring等条件的下推,减轻Metastore的数据返回压力。
优化效果
- 大约95%的join SQL被调整为ShuffledHashJoin或BroadcastJoin,整体执行速度提升了20%~30%。
- 基于Parquet数据读取剪枝技术,命中索引的性能提升了30%,生成时间增加了10%,但空间占用只增加了5%。
- 特定SQL(例如需要返回16列且带有两个条件的SQL)的性能提升了20%。
运行期调优
在SQL执行前,通过统一的查询入口,基于成本的预估选择合适的引擎和参数。具体步骤包括:
- SQL分析:抽取Hive explain逻辑,进行SQL语法检查,并标注输入的数据量和使用的算子。
- 自动引擎选择/自动参数优化:根据SQL的大小选择不同的执行引擎和参数设置。例如,小SQL走Spark Server,其他默认走Spark-Submit,以减少资源请求的时间。Executor数量、内存Overhead和堆外内存也会根据情况进行调整。
这些优化措施显著提高了查询效率,使得Adhoc查询在30秒内的占比达到了45%,并且Spark-Submit的内存使用量平均减少了20%。