一直在找一个大数据领域的通用编译优化器,最近注意到weld,这东西2017年就出来了,看着实在太强大。回头把相关论文撸一把,很hgih。
论文:
https://cs.stanford.edu/~matei/papers/2017/cidr_weld.pdf
数砖的介绍
https://www.slideshare.net/databricks/composable-parallel-processing-in-apache-spark-and-weld
网上找到的一份ppt介绍:https://www.weld.rs/assets/weld-strata.pdf
看到阿里云的EMR Spark-SQL也使用了这个weld做运行时
https://developer.aliyun.com/article/758861
运行时
这次的优化里面,还有一个很好玩的优化,就是我们引入的 Native Runtime,如果说上述的优化器优化都是一些特殊 Case 的杀手锏,Native Runtime 就是一个广谱大杀器,根据我们后期统计,引入 Native Runtime,可以普适性的提高 SQL Query 15~20%的 E2E 耗时,这个在TPCDS Perf 里面也是一个很大的性能提升点。
大致的介绍一下 Native Runtime
基于开源版本的 WholeStageCodeGeneration 的框架,在原有的生成的 Java 代码,替换成 Weld IR 来真实运行。Weld详细参考 http://weld.stanford.edu/。在整个项目里,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 执行