SPARK的计算向量化-已有的向量化项目

本文介绍了多种用于Spark计算引擎的向量化技术,如Facebook的Velox,Databricks的Photon,Intel的Gandiva和gluten项目,以及基于Apache Arrow的DataFusion和Blaze。这些技术利用SIMD指令、C++实现和LLVM优化来提升性能,同时通过列格式数据传输和Columnar Shuffle提高运算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

SPARK的计算向量化-spark本身的向量化中,我们提到spark是利用代码生成(生成for循环),从而JIT进行向量化。这是有局限的,所以大部分公司都会采用通过其他方式来进行向量化计算。
我们列举几种已知的应用到spark计算引擎的向量化技术。

Velox

Meta(也就是Facebook)开源的一个C++实现的SQL执行引擎,输入逻辑执行计划,利用SIMD指令实现向量化操作,输出结果;
结合Apache Arrow作数据交换,可以实现Spark的计算向量化。
项目见facebookincubator/velox

Photon

这是Databricks执行引擎的内部实现,也是用C++实现的,但是它复用了spark的逻辑计划,在物理计划task级别进行判断哪些是可以运行在Photon,具体执行位置如下:
在这里插入图片描述

gazelle

Intel开源的,底层依赖于Apache Arrow高效数据存储和Gandiva(基于LLVM)的高效向量计算,但是Gandiva目前只是支持表达式向量化,不支持sort,join这种物理算子。
在这里插入图片描述

项目见:gazelle_plugin

blaze 和Arrow DataFusion

DataFusion(是Apache Arrow的一部分) 是用Rust语言实现的,使用Apache Arrow作为内存格式的向量化计算引擎框架,它支持用SQL和DataFrame API构建逻辑计划,以及能够使用线程对分区数据源(CSV 和 Parquet)并行执行的查询优化器和执行引擎。

项目见:arrow-datafusion(2k的星)

Blaze是基于 arrow datafusion 向量化执行引擎构建的 Spark 加速器。它从 Spark获取一个完全优化的物理计划,将其映射到 DataFusion 的执行计划中,并在Spark executor中计算,同时结合了DataFusion 库的强大功能和 Spark 分布式计算框架的可扩展性。

项目见:blaze-init/blaze

gluten

Intel开源的解藕spark jvm和native SQL执行引擎的项目,它利用substrait进行解藕,通过把spark的物理计划转换为对应的substrait plan,之后再传递到后台的native SQL backend执行引擎执行。当然也是利用了Apache Arrow作为数据存储。

在这里插入图片描述

项目见:oap-project/gluten

额外话题(自己的理解):columnar shuffle

我们知道在spark内部,spark的数据都是按行处理的,但是如果我们进行了native向量化以后,为了高效的进行向量化计算,内部的数据传输采用的都是列格式,所以在Native sql引擎侧的话,就得采用列格式的shuffle,这样才会更好的提升后续的operator计算效率(如果还是采用基于行格式的shuffle的话,就得进行类似ColumnarToRow和RowToColumnar的操作,这大大降低了整体的性能),columnar shuffle操作如下(聚合操作):
在这里插入图片描述

参考

本文参考了:
Velox: 现代化的向量化执行引擎
Announcing Photon Public Preview: The Next Generation Query Engine on the Databricks Lakehouse Platform
Apache Arrow Gandiva:远大理想与尴尬现实

### 向量化数据库存储API文档和使用 对于向量化数据库存储的API,通常涉及高效的数据处理框架如Apache Spark中的DataFrame API。在Spark中,推荐优先使用的API基于DataFrame而非RDD[^1]。 当涉及到具体实现细节时,在Spark源码仓库中有完整的示例代码可供参考。例如`examples/src/main/scala/org/apache/spark/examples/sql/hive/SparkHiveExample.scala`展示了如何指定Hive表的存储格式[^2]。虽然这主要针对的是Hive表格操作,但是概念上与配置其他类型的结构化数据源相似。 为了更好地理解向量化数据库存储API的应用场景和技术要点: - **定义**:向量化数据库优化了查询执行引擎以支持批量处理指令集(SIMD),从而提高了性能。 - **创建外部表并设置存储参数** 使用SQL语句可以方便地管理不同种类的数据文件作为外部表来访问。下面是一个简单的例子展示怎样通过指定ORC格式保存数据到分布式文件系统中: ```sql CREATE EXTERNAL TABLE my_table (id INT, name STRING) STORED AS ORC LOCATION '/path/to/data'; ``` - **读取已有的分区表** 如果存在已经按照一定规则划分好区域的大规模静态数据集合,则可以直接加载这些预分片后的资源而无需额外转换过程。 ```python df = spark.read.format("parquet").load("/user/hive/warehouse/my_partitioned_table") ``` 上述方法不仅限于特定品牌的产品;实际上大多数现代大数据解决方案都提供了类似的接口用于简化开发者的工作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值