DataWorks 数据集成支持使用 Apache Arrow 列存格式实现跨数据源的高性能数据同步。该方案通过内存直通与零拷贝技术,将行式传输升级为列式传输,提升大数据量场景下的同步吞吐量。根据测试场景,性能最高可提升近10倍。
业务场景说明
在处理海量数据时,基于行存的数据同步方案常因频繁的序列化、反序列化及类型转换而出现性能瓶颈。尤其在数据仓库迁移(例如从 Hive 迁移至 MaxCompute)或构建湖仓一体架构时,TB 级数据的同步耗时过长,会影响业务上线和数据分析效率。此方案用于解决大规模列存数据源之间的数据流转效率问题,可将同步耗时从小时级缩短至分钟级。
场景一:大数据搬站迁移
痛点:从Hive向MaxCompute迁移数百TB数据,耗时较久,影响业务上线。
方案:启用Arrow同步,列存直传,避免格式转换。
成果:迁移时间从小时级同步缩短至分钟级,效率提升10倍以上。
场景二:异构数据源融合与湖仓一体化
让数据在湖(如Hive生态)与仓(Hologres/MaxCompute)之间自由、高效地流转。核心价值:一数多用,湖仓协同。
方案架构
DataWorks 数据集成通过引入 Apache Arrow 列式内存标准,重构了数据在 Reader 和 Writer 之间的传输方式,实现了从行式处理到列式直通的转变。
传统行存同步架构
在传统架构中,数据以行为单位进行处理。即使源和目标均为列存格式(如 Parquet 或 ORC),数据在同步引擎内部也会被转换为通用的行式 Record 对象。面向单行行存的格式设计,每一个Record对象定义了若干个Column,每个Column包含当前行对应该列的列值Value。以MaxCompute(ODPS)列存数据同步到MaxCompute(ODPS)列存为例:
此流程包含以下步骤,并会产生以下性能开销:
Reader 解码:Reader 从源端(如 MaxCompute)读取列存数据,将其解码并逐行转换为框架内部的
Record对象。框架传输:框架在内存队列中传输大量的
Record对象。Writer 编码:Writer 从框架获取
Record对象,再将其编码为目标端所需的列存格式后写入。
这一过程涉及多次数据格式转换、序列化/反序列化以及高频的对象创建,导致较高的 CPU 和内存资源消耗,并引发频繁的垃圾回收(GC),限制了整体吞吐。
Arrow 列存同步架构
基于 Arrow 的新架构实现了端到端的列式数据流。数据在整个同步链路中保持其列存格式,避免了行式转换的开销。
通过引入 ArrowTabularRecord 数据结构,同步流程被优化为:
Reader 直读:Reader通过 MaxCompute Tunnel Arrow API直接读取源端的列存数据,并将其封装为
ArrowTabularRecord批量投递给框架。框架传输:框架直接传递包含二进制列数据的
ArrowTabularRecord。Writer 直写:Writer通过 Tunnel Arrow API直接从
ArrowTabularRecord中获取 Arrow 格式的二进制数据,通过零拷贝技术将其传输至目标端(如 Tunnel Server),无需再次序列化。
该架构通过对Arrow的原生支持,消除了中间的行式转换环节,实现端到端列存“短路同步”,大幅提升吞吐量、降低延迟。
实施步骤
在 DataWorks 数据集成任务中添加特定参数可启用 Arrow 高性能同步。目前支持源端与目标端为 MaxCompute、Hologres、Hive/OSS/HDFS(Parquet/ORC) 这几种类型的整库离线同步和单表离线同步。
方式一:整库离线同步
使用数据集成提供的整库离线同步任务功能(例如 Hive 到 MaxCompute 的离线整库),系统会根据源和目标表的字段类型自动判断并启用 Arrow 高性能同步,无需手动配置。支持在任务编辑界面右上角的中查看。

方式二:单表离线同步
在配置 单表离线同步 任务时,通过脚本模式配置可在 Reader 和 Writer 的 parameter 配置中都添加 "useArrow":true 来手动启用。
配置前提:启用此功能要求源端与目标端表的列类型定义保持一致。因为该模式会跳过类型转换环节,直接进行内存数据传输。
以下是一个从 Hive (Reader) 同步到 MaxCompute (Writer) 的示例配置:
{
"type": "job",
"steps": [
{
"stepType": "hive",
"parameter": {
"useArrow": true,
"datasource": "my_datasource",
"column": [
"col1",
"col2"
],
"readMode": "hdfs",
"table": "table"
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "odps",
"parameter": {
"useArrow": true,
"truncate": false,
"datasource": "odps_test",
"column": [
"col1",
"col2"
],
"table": "table"
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"speed": {
"concurrent": 3
}
}
}性能验证
以下是部分数据源的性能提升比例。性能验证的测试条件如下:
压测条件:服务器规格:64C 256GB,网卡:2.5万兆网卡。
测试数据量:42045700 条数据。
数据源 | 支持能力 | 同步性能提升 |
MaxCompute | 通过Tunnel Arrow API直读列存数据 | 同步性能提升 200% |
Hologres | 支持Arrow格式导出,避免JDBC行式瓶颈 | 同步性能提升 95% |
Hive\OSS\HDFS等分布式文件 | 直接读取Parquet/ORC底层Arrow格式数据 | PARQUET同步性能提升5.55倍ORC同步性能提升 9.85倍 |
启用 Arrow 前后的性能对比如下。
场景一:MaxCompute列存短路同步(Arrow → Arrow)
并发数 | 传统行存 | Arrow列存 | 性能提升 |
1 | 67.8 MB/s 3740 R/s | 212.6 MB/s 11462 R/s | +206.5% |
3 | 185.6 MB/s 10226 R/s | 569.9 MB/s 30728 R/s | +200.5% |
8 | 462.1 MB/s 25467 R/s | 1321.0 MB/s 71143 R/s | +197.4% |
场景二:Hologres → MaxCompute 同步
并发数 | 传统同步 | Arrow同步 | 性能提升 |
4 | 439.1 MB/s 216480 R/s | 906.1 MB/s 404270 R/s | +87% |
8 | 773.3 MB/s 381300 R/s | 1669.1 MB/s 745654 R/s | +95% |
场景三:Parquet/ORC → MaxCompute 同步
列存格式 | 传统同步 | Arrow同步 | 性能提升 |
Parquet | 26.1 MB/s 35631 R/s | 1198.1 MB/s 233587 R/s | 5.55倍 |
ORC | 21.4 MB/s 27661 R/s | 3256.3 MB/s 300326 R/s | 9.85倍 |
Parquet、ORC为HDFS、OSS等分布式文件系统中的列存格式。