Arrow列存格式高效能同步

更新時間:
Copy as MD

DataWorks Data Integration支援使用 Apache Arrow 列存格式實現跨資料來源的高效能資料同步。該方案通過記憶體直通與零拷貝技術,將行式傳輸升級為列式傳輸,提升巨量資料量情境下的同步輸送量。根據測試情境,效能最高可提升近10倍。

業務情境說明

在處理海量資料時,基於行存的資料同步方案常因頻繁的序列化、還原序列化及類型轉換而出現效能瓶頸。尤其在資料倉儲遷移(例如從 Hive 遷移至 MaxCompute)或構建湖倉一體架構時,TB 級資料的同步耗時過長,會影響業務上線和資料分析效率。此方案用於解決大規模列存資料來源之間的資料流轉效率問題,可將同步耗時從小時級縮短至分鐘級。

情境一:巨量資料搬站遷移

痛點:從HiveMaxCompute遷移數百TB資料,耗時較久,影響業務上線。
方案:啟用Arrow同步,列存直傳,避免格式轉換。
成果:遷移時間從小時級同步縮短至分鐘級,效率提升10倍以上。

情境二:異構資料來源融合與湖倉一體化

讓資料在湖(如Hive生態)與倉(Hologres/MaxCompute)之間自由、高效地流轉。核心價值:一數多用,湖倉協同。

方案架構

DataWorks Data Integration通過引入 Apache Arrow 列式記憶體標準,重構了資料在 Reader 和 Writer 之間的傳輸方式,實現了從行式處理到列式直通的轉變。

傳統行存同步架構

在傳統架構中,資料以行為單位進行處理。即使源和目標均為列存格式(如 Parquet 或 ORC),資料在同步作業引擎內部也會被轉換為通用的行式 Record 對象。面向單行行存的格式設計,每一個Record對象定義了若干個Column,每個Column包含當前行對應該列的列值Value。以MaxCompute(ODPS)列存資料同步到MaxCompute(ODPS)列存為例:

此流程包含以下步驟,並會產生以下效能開銷:

  1. Reader 解碼:Reader 從源端(如 MaxCompute)讀取列存資料,將其解碼並逐行轉換為架構內部的 Record 對象。

  2. 架構傳輸:架構在記憶體隊列中傳輸大量的 Record 對象。

  3. Writer 編碼:Writer 從架構擷取 Record 對象,再將其編碼為目標端所需的列存格式後寫入。

這一過程涉及多次資料格式轉換、序列化/還原序列化以及高頻的對象建立,導致較高的 CPU 和記憶體資源消耗,並引發頻繁的記憶體回收(GC),限制了整體吞吐。

Arrow 列存同步架構

基於 Arrow 的新架構實現了端到端的列式資料流。資料在整個同步鏈路中保持其列存格式,避免了行式轉換的開銷。

通過引入 ArrowTabularRecord 資料結構,同步流程被最佳化為:

  1. Reader 直讀:Reader通過 MaxCompute Tunnel Arrow API直接讀取源端的列存資料,並將其封裝為 ArrowTabularRecord 批量投遞給架構。

  2. 架構傳輸:架構直接傳遞包含二進位列資料的 ArrowTabularRecord

  3. Writer 直寫:Writer通過 Tunnel Arrow API直接從 ArrowTabularRecord 中擷取 Arrow 格式的位元據,通過零拷貝技術將其傳輸至目標端(如 Tunnel Server),無需再次序列化。

該架構通過對Arrow的原生支援,消除了中間的行式轉換環節,實現端到端列存“短路同步”,大幅提升輸送量、降低延遲。

實施步驟

在 DataWorks Data Integration任務中添加特定參數可啟用 Arrow 高效能同步。目前支援源端與目標端為 MaxCompute、Hologres、Hive/OSS/HDFS(Parquet/ORC) 這幾種類型的整庫離線同步和單表離線同步。

方式一:整庫離線同步

使用Data Integration提供的整庫離線同步任務功能(例如 Hive 到 MaxCompute 的離線整庫),系統會根據源和目標表的欄位類型自動判斷並啟用 Arrow 高效能同步,無需手動設定。支援在任務編輯介面右上方的高級配置 > 高級參數 > 運行時配置中查看。

運行時配置中,找到是否開啟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.55ORC同步效能提升 9.85

情境一: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、OSSDistributed File System中的列存格式。