[實戰系列]SelectDB Cloud Datax 數據寫入最佳實踐

前言

企業正在經歷其數據資產的爆炸式增長,這些數據包括批式或流式傳輸的結構化、半結構化以及非結構化數據,隨著海量數據批量導入的場景的增多,企業對于 Data Pipeline 的需求也愈加復雜。新一代云原生實時數倉 SelectDB Cloud 作為一款運行于多云之上的云原生實時數據倉庫,致力于通過開箱即用的能力為客戶帶來簡單快速的數倉體驗。在生態方面,SelectDB Cloud 提供了豐富的數據連接器插件(Connector)來連接各種來自周邊大數據工具的數據源,內置 Kafka、Flink、Spark、DataX 等常見的 Connector。基于此,企業開發者能夠更加便捷的將數據移動到 SelectDB Cloud 上,并利用 SelectDB Cloud 從數據資產中獲取更高的價值。

SelectDB Cloud 基于 Apache Doris 研發的新一代云原生實時數倉 SelectDB,運行于多家云上,為客戶提供極簡運維和極致性價比的數倉服務

介紹

DataX 是一個異構數據源離線同步工具,致力于實現包括關系型數據庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP,等各種異構數據源之間穩定高效的數據同步功能。

image.png

Selectdb 提供了datax-selectdb-writer 插件,可以將datax 支持的數據源同步到selectdb中
框架設計
主要分為三個部分:Reader,FrameWork,Writer

image.png
  • Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
  • Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,并將數據寫入到目的端。
  • Framework:Framework用于連接reader和writer,作為兩者的數據傳輸通道,并處理緩沖,流控,并發,數據轉換等核心技術問題。

執行流程

image.png
  1. DataX完成單個數據同步的作業,我們稱之為Job,DataX接受到一個Job之后,將啟動一個進程來完成整個作業同步過程。DataX Job模塊是單個作業的中樞管理節點,承擔了數據清理、子任務切分(將單一作業計算轉化為多個子Task)、TaskGroup管理等功能。
  2. DataXJob啟動后,會根據不同的源端切分策略,將Job切分成多個小的Task(子任務),以便于并發執行。Task便是DataX作業的最小單元,每一個Task都會負責一部分數據的同步工作。
  3. 切分多個Task之后,DataX Job會調用Scheduler模塊,根據配置的并發數據量,將拆分成的Task重新組合,組裝成TaskGroup(任務組)。每一個TaskGroup負責以一定的并發運行完畢分配好的所有Task,默認單個任務組的并發數量為5。
  4. 每一個Task都由TaskGroup負責啟動,Task啟動后,會固定啟動Reader—>Channel—>Writer的線程來完成任務同步工作。
  5. DataX作業運行起來之后, Job監控并等待多個TaskGroup模塊任務完成,等待所有TaskGroup任務完成后Job成功退出。否則,異常退出,進程退出值非0

Selectdb writer介紹
1. 快速介紹
該插件主要將 MySQL、Oracle 等數據庫中的數據導入至 SELECTDB。該插件將數據轉化為 CSV 或 JSON 格式并將其通過 copy into 方式批量導入至 SELECTDB。

  1. 實現原理

SelectdbWriter 通過調用selectdb upload api,返回一個重定向的S3地址,使用Http向S3地址發送字節流,設置參數達到要求時執行copy into

3. 編譯
1. 下載
git clone https://github.com/selectdb/datax-selectdb.git
2. 運行 init-env.sh
這個腳本主要用于構建 DataX 開發環境,他主要進行了以下操作: 1 .將 DataX 代碼庫 clone 到本地。 2. 將 doriswriter/ 目錄軟鏈到 DataX/selectdbwriter 目錄。 3. 在 DataX/pom.xml 文件中添加 <module>selectdbwriter</module> 模塊。 4. 這個腳本執行后,開發者就可以進入 DataX/ 目錄開始開發或編譯了。因為做了軟鏈, 所以任何對 DataX/doriswriter 目錄中文件的修改,都會反映到 doriswriter/ 目錄中, 方便開發者提交代碼。

3. 編譯 selectdbwriter

  1. 編譯整個 DataX 項目
mvn package assembly:assembly -Dmaven.test.skip=true 

產出在 target/datax/datax/. hdfsreader, hdfswriter and oscarwriter 這三個插件需要額外的jar包。如果你并不需要這些插件,可以在 DataX/pom.xml 中刪除這些插件的模塊。

  1. 單獨編譯 doriswriter 插件
mvn clean install -pl plugin-rdbms-util,doriswriter -DskipTests
  1. 編譯錯誤

如遇到如下編譯錯誤:
Could not find artifact com.alibaba.datax:datax-all:pom:0.0.1-SNAPSHOT ...
可嘗試以下方式解決:

  • 下載 alibaba-datax-maven-m2-20210928.tar.gz
  • 解壓后,將得到的 alibaba/datax/ 目錄,拷貝到所使用的 maven 對應的 .m2/repository/com/alibaba/ 下。
  • 再次嘗試編譯。
  1. 示例
  • 配置樣例

這里是一份從Stream讀取數據后導入至selectdb的配置文件。

{
  "job":{
    "content":[
      {
        "reader":{
          "name":"streamreader",
          "parameter":{
            "column":[
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"long",
                "random":"0,5"
              },
              {
                "type":"string",
                "random":"0,10"
              },
              {
                "type":"string",
                "random":"0,5"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"string",
                "random":"0,21"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"long",
                "random":"0,20"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"string",
                "random":"0,10"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"long",
                "random":"0,10"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"string",
                "random":"0,100"
              },
              {
                "type":"string",
                "random":"0,1"
              },
              {
                "type":"long",
                "random":"0,1"
              },
              {
                "type":"string",
                "random":"0,64"
              },
              {
                "type":"string",
                "random":"0,20"
              },
              {
                "type":"string",
                "random":"0,31"
              },
              {
                "type":"long",
                "random":"0,3"
              },
              {
                "type":"long",
                "random":"0,3"
              },
              {
                "type":"long",
                "random":"0,19"
              },
              {
                "type":"date",
                "random":"2022-01-01 12:00:00,2023-01-01 12:00:00"
              },
              {
                "type":"string",
                "random":"0,1"
              }
            ],
            "sliceRecordCount":10
          }
        },
        "writer":{
          "name":"selectdbwriter",
          "parameter":{
            "loadUrl":[
              "xxx:47150"
            ],
            "loadProps":{
              "file.type":"json",
              "file.strip_outer_array":"true"
            },
            "column":[
              "id",
              "table_id",
              "table_no",
              "table_name",
              "table_status",
              "no_disturb",
              "dinner_type",
              "member_id",
              "reserve_bill_no",
              "pre_order_no",
              "queue_num",
              "person_num",
              "open_time",
              "open_time_format",
              "order_time",
              "order_time_format",
              "table_bill_id",
              "offer_time",
              "offer_time_format",
              "confirm_bill_time",
              "confirm_bill_time_format",
              "bill_time",
              "bill_time_format",
              "clear_time",
              "clear_time_format",
              "table_message",
              "bill_close",
              "table_type",
              "pad_mac",
              "company_id",
              "shop_id",
              "is_sync",
              "table_split_no",
              "ts",
              "ts_format",
              "dr"
            ],
            "username":"admin",
            "password":"",
            "postSql":[

            ],
            "preSql":[

            ],
            "connection":[
              {
                "jdbcUrl":"jdbc:mysql://xxx:34142/cl_test",
                "table":[
                  "ods_pos_pro_table_dynamic_delta_v4"
                ],
                "selectedDatabase":"cl_test"
              }
            ],
            "maxBatchRows":1000000,
            "maxBatchByteSize":536870912000
          }
        }
      }
    ],
    "setting":{
      "errorLimit":{
        "percentage":0.02,
        "record":0
      },
      "speed":{
        "channel":5
      }
    }
  }
}
image.gif
  • 執行任務

python $DATAX_HOME/datax.py ../xx.json

  • 參數說明
 **jdbcUrl**

    - 描述:selectdb 的 JDBC 連接串,用戶執行 preSql 或 postSQL。
    - 必選:是
    - 默認值:無

* **loadUrl**

    - 描述:作為 selecdb 的連接目標。格式為 "ip:port"。其中 IP 是 selectdb的private-link,port 是selectdb 集群的 http_port
    - 必選:是
    - 默認值:無

* **username**

    - 描述:訪問selectdb數據庫的用戶名
    - 必選:是
    - 默認值:無

* **password**

    - 描述:訪問selectdb數據庫的密碼
    - 必選:否
    - 默認值:空

* **connection.selectedDatabase**
    - 描述:需要寫入的selectdb數據庫名稱。
    - 必選:是
    - 默認值:無

* **connection.table**
    - 描述:需要寫入的selectdb表名稱。
        - 必選:是
        - 默認值:無

* **column**

    - 描述:目的表**需要寫入數據**的字段,這些字段將作為生成的 Json 數據的字段名。字段之間用英文逗號分隔。例如: "column": ["id","name","age"]。
    - 必選:是
    - 默認值:否

* **preSql**

    - 描述:寫入數據到目的表前,會先執行這里的標準語句。
    - 必選:否
    - 默認值:無

* **postSql**

    - 描述:寫入數據到目的表后,會執行這里的標準語句。
    - 必選:否
    - 默認值:無

* **maxBatchRows**

    - 描述:每批次導入數據的最大行數。和 **batchSize** 共同控制每批次的導入數量。每批次數據達到兩個閾值之一,即開始導入這一批次的數據。
    - 必選:否
    - 默認值:500000

* **batchSize**

    - 描述:每批次導入數據的最大數據量。和 **maxBatchRows** 共同控制每批次的導入數量。每批次數據達到兩個閾值之一,即開始導入這一批次的數據。
    - 必選:否
    - 默認值:90M

* **maxRetries**

    - 描述:每批次導入數據失敗后的重試次數。
    - 必選:否
    - 默認值:3

* **labelPrefix**

    - 描述:每批次上傳文件的 label 前綴。最終的 label 將有 `labelPrefix + UUID` 組成全局唯一的 label,確保數據不會重復導入
    - 必選:否
    - 默認值:`datax_selectdb_writer_`

* **loadProps**

    - 描述:COPY INOT 的請求參數

      這里包括導入的數據格式:file.type等,導入數據格式默認我們使用csv,支持JSON,具體可以參照下面類型轉換部分

    - 必選:否

    - 默認值:無

* **clusterName**

  - 描述:selectdb could 集群名稱

  - 必選:否

  - 默認值:無

* **flushQueueLength**

  - 描述:隊列長度

  - 必選:否

  - 默認值:1

* **flushInterval**

  - 描述:數據寫入批次的時間間隔,如果maxBatchRows 和 batchSize 參數設置的有很大,那么很可能達不到你這設置的數據量大小,會執行導入。

  - 必選:否

  - 默認值:30000ms  
image.gif
  1. 類型轉化

默認傳入的數據均會被轉為字符串,并以\t作為列分隔符,\n作為行分隔符,組成csv文件進行Selectdb導入操作。
默認是csv格式導入,如需更改列分隔符, 則正確配置 loadProps 即可:

"loadProps": {     "file.column_separator": "\\x01",     "file.line_delimiter": "\\x02" } 
image.gif

如需更改導入格式為json, 則正確配置 loadProps 即可:

 "loadProps": {     "file.type": "json",     "file.strip_outer_array": true } 

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 開篇 ?最早接觸DataX是在前阿里同事在現在的公司引入的時候提到的,一直想抽空好好看看這部分代碼,因為DataX...
    晴天哥_王志閱讀 42,159評論 16 45
  • 概覽 DataX 是一個異構數據源離線同步工具,致力于實現包括關系型數據庫(MySQL、Oracle等)、HDFS...
    tracy_668閱讀 707評論 0 1
  • 第1章 DataX簡介 1.1 DataX概述 源碼地址:https://github.com/alibaba/D...
    CJ21閱讀 2,921評論 0 2
  • 一、DataX是什么 DataX[https://github.com/alibaba/DataX]是阿里巴巴開源...
    文景大大閱讀 6,407評論 1 18
  • Datax3.0使用說明 原文鏈接:https://github.com/alibaba/DataX/blob/m...
    搬磚的廚子閱讀 548評論 0 2