背景
Apache Datafusion Comet 是苹果公司开源的加速Spark运行的向量化项目。
本项目采用了 Spark插件化 + Brotobuf + Arrow + DataFusion 架构形式
其中
- Spark插件是 利用 SparkPlugin 插件,其中分为 DriverPlugin 和 ExecutorPlugin ,这两个插件在driver和 Executor启动的时候就会调用
- Brotobuf 是用来序列化 spark对应的表达式以及计划,用来传递给 native 引擎去执行,利用了 体积小,速度快的特性
- Arrow 是用来 spark 和 native 引擎进行高效的数据交换(native执行的结果或者spark执行的数据结果),主要在JNI中利用Arrow IPC 列式存储以及零拷贝等特点进行进程间数据交换
- DataFusion 主要是利用Rust native以及Arrow内存格式实现的向量化执行引擎,Spark中主要offload对应的算子到该引擎中去执行
使用
export COMET_JAR=spark/target/comet-spark-spark3.5_2.12-0.13.0-SNAPSHOT.jar
$SPARK_HOME/bin/spark-shell \
--jars $COMET_JAR \
--conf spark.driver.extraClassPath=$COMET_JAR \
--conf spark.executor.extraClassPath=$COMET_JAR \
--conf spark.plugins=org.apache.spark.CometPlugin \
--conf spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager \
--conf spark.comet.explainFallback.enabled=true \
--conf spark.memory.offHeap.enabled=true \
--conf spark.memory.offHeap.size=16g
主要是在classpath下得有对应的 comet对应的动态库
其中 spark.plugins=org.apache.spark.CometPlugin是开启 native 插件,主要是插入一些native计划,也是最核心的部分
spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager 是采用列式shuffle(采用Arrow IPC RecordBatch格式)进行数据交互
spark.memory.offHeap.enabled 开启offheap模式,该模式下,执行内存都是用native内存进行分配。
说明
-
native code基准测试
借助Rust的提供的第三方基准测试工具Criterion, 可以进行native code性能的好坏,提供了更详细的统计分析、图表、与先前基准的差异对比,帮助开发者精确评估代码性能优化效果
-
flamegraph native火焰图的生成
通过Rust三方提供的火焰图生成工具flamegraph,可以快读的定位出具体的函数耗时,而从帮助开发者快速的定位问题
对于该Datafusion Comet项目,工具使用见profiling_native_code
相对于其他开发语言,如java这种,如果说要进行基准测试和火焰图的生成,是需要手动进行下载对应的工具,而rust这种提供的三方包可以直接在代码级别进行了测试,确实是方便了不少
-
关于该项目讨论
见Donation of a Spark native engine based on DataFusion & Arrow