Arrow列存格式高性能同步

DataWorks 数据集成支持使用 Apache Arrow 列存格式实现跨数据源的高性能数据同步。该方案通过内存直通与零拷贝技术,将行式传输升级为列式传输,提升大数据量场景下的同步吞吐量。根据测试场景,性能最高可提升近10倍。

业务场景说明

在处理海量数据时,基于行存的数据同步方案常因频繁的序列化、反序列化及类型转换而出现性能瓶颈。尤其在数据仓库迁移(例如从 Hive 迁移至 MaxCompute)或构建湖仓一体架构时,TB 级数据的同步耗时过长,会影响业务上线和数据分析效率。此方案用于解决大规模列存数据源之间的数据流转效率问题,可将同步耗时从小时级缩短至分钟级。

场景一:大数据搬站迁移

痛点:从HiveMaxCompute迁移数百TB数据,耗时较久,影响业务上线。
方案:启用Arrow同步,列存直传,避免格式转换。
成果:迁移时间从小时级同步缩短至分钟级,效率提升10倍以上。

场景二:异构数据源融合与湖仓一体化

让数据在湖(如Hive生态)与仓(Hologres/MaxCompute)之间自由、高效地流转。核心价值:一数多用,湖仓协同。

方案架构

DataWorks 数据集成通过引入 Apache Arrow 列式内存标准,重构了数据在 Reader 和 Writer 之间的传输方式,实现了从行式处理到列式直通的转变。

传统行存同步架构

在传统架构中,数据以行为单位进行处理。即使源和目标均为列存格式(如 Parquet 或 ORC),数据在同步引擎内部也会被转换为通用的行式 Record 对象。面向单行行存的格式设计,每一个Record对象定义了若干个Column,每个Column包含当前行对应该列的列值Value。以MaxCompute(ODPS)列存数据同步到MaxCompute(ODPS)列存为例:

image

此流程包含以下步骤,并会产生以下性能开销:

  1. Reader 解码:Reader 从源端(如 MaxCompute)读取列存数据,将其解码并逐行转换为框架内部的 Record 对象。

  2. 框架传输:框架在内存队列中传输大量的 Record 对象。

  3. Writer 编码:Writer 从框架获取 Record 对象,再将其编码为目标端所需的列存格式后写入。

这一过程涉及多次数据格式转换、序列化/反序列化以及高频的对象创建,导致较高的 CPU 和内存资源消耗,并引发频繁的垃圾回收(GC),限制了整体吞吐。

Arrow 列存同步架构

基于 Arrow 的新架构实现了端到端的列式数据流。数据在整个同步链路中保持其列存格式,避免了行式转换的开销。

image

通过引入 ArrowTabularRecord 数据结构,同步流程被优化为:

  1. Reader 直读:Reader通过 MaxCompute Tunnel Arrow API直接读取源端的列存数据,并将其封装为 ArrowTabularRecord 批量投递给框架。

  2. 框架传输:框架直接传递包含二进制列数据的 ArrowTabularRecord

  3. Writer 直写:Writer通过 Tunnel Arrow API直接从 ArrowTabularRecord 中获取 Arrow 格式的二进制数据,通过零拷贝技术将其传输至目标端(如 Tunnel Server),无需再次序列化。

该架构通过对Arrow的原生支持,消除了中间的行式转换环节,实现端到端列存“短路同步”,大幅提升吞吐量、降低延迟。

image

实施步骤

在 DataWorks 数据集成任务中添加特定参数可启用 Arrow 高性能同步。目前支持源端与目标端为 MaxCompute、Hologres、Hive/OSS/HDFS(Parquet/ORC) 这几种类型的整库离线同步和单表离线同步。

方式一:整库离线同步

使用数据集成提供的整库离线同步任务功能(例如 Hive 到 MaxCompute 的离线整库),系统会根据源和目标表的字段类型自动判断并启用 Arrow 高性能同步,无需手动配置。支持在任务编辑界面右上角的高级配置 > 高级参数 > 运行时配置中查看。

PixPin_2025-12-19_16-05-22

方式二:单表离线同步

在配置 单表离线同步 任务时,通过脚本模式配置可在 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.55ORC同步性能提升 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、ORCHDFS、OSS等分布式文件系统中的列存格式。