DataX簡介(3.0版本)

聞香識程式碼發表於2020-10-18

DataX簡介(3.0版本)

1. 背景

1.1. 概覽

在這裡插入圖片描述

  1. 在大資料處理業務框架中,需要處理的資料一般是2個來源(行為日誌和業務資料),有些公司如果有python部門,就需要加上python資料這一個。
  2. python資料因為各個公司以及各個頁面和介面中資料差異較大,一般需要針對公司和特定業務編寫程式進行解析,然後存入HDFS或者其他分散式檔案系統中。一般都是編寫Spark程式(可以分散式進行處理,效率對比java程式要更高。當然,也可以使用java編寫mapreduce程式)。
  3. 行為日誌資料,此前已經說過,一般都是使用flume等分散式日誌採集框架進行採集,因為這些框架比較成熟,可以直接進行一些預處理,然後存入HDFS或者其他地方。
  4. 業務資料一般都是存放在關係型資料庫如mysql或者oracle,或者windows server中。沒錯,後2個都是需要花錢的,特別是oracle,一般公司用不起。這時候將資料從關係型資料庫匯出到大資料檔案存放系統中,或者反過來,將資料從大資料檔案存放系統中匯出到關係型資料庫中,目前使用datax做資料匯入匯出框架也逐漸增加。
  5. 不管是流量域資料(行為日誌資料),還是業務域資料(儲存在關係型資料庫中業務資料),都是按照經典數倉分層進行處理,儲存,以便於計算和分析,最後做展示。
  6. 經典數倉分層,一般是DIM維度層,再之上就是ODS貼源層,然後是DW層(一般劃分為DWD資料明細層,DWS資料服務層),然後是ADS應用層。而不管是流量域還是業務域的資料,都是需要按照這個分層進行資料預處理,提取,處理,儲存到這些層級的。

1.2 官網

https://github.com/alibaba/DataX/blob/master/introduction.md
在這裡插入圖片描述
2. DataX 是阿里巴巴集團內被廣泛使用的離線資料同步工具/平臺,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各種異構資料來源之間高效的資料同步功能。
3. 因為阿里本身也有資料儲存產品,所以肯定是支援的,你懂的.

2. 安裝

  1. 官網下載datax包,之後解壓
  2. 注意,一般第三方軟體都是放在linux的opt或者usr目錄下

3. 使用

3.1 簡單使用

  1. 編寫json配置檔案,配置檔案結構如下:
{
    "job": {
        "content": [

                "reader": {
                },
                "writer": {
               }
        ],
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

具體的reader,writer引數官網有說明
2. 執行 python datax.py xx.json
3. 調優,主要是調整channel,byte,record引數,不過具體效能還是取決於源端資料庫的表是否適合切分,是否有合適的切分欄位,切分欄位最好為數字。

這一點和sqoop很相似,切分資料的欄位最好是數字,雖然非數字也可以做切分,但資料劃分時,無法跟數字那樣做比較均勻的資料量切分.

3.2 從mysql抽取資料到HDFS

  1. 配置檔案
{
    "setting": {},
    "job": {
        "setting": {
            "speed": {
                "channel": 2
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "ABC123abc.123",
                        "column": [
                            "id",
                            "name",
						"gender",
						"addr"
                        ],
                        "splitPk": "id",
                        "connection": [
                            {
                                "table": [
                                    "demo1"
                                ],
                                "jdbcUrl": [
     "jdbc:mysql://doit01:3306/dataxtest?useUnicode=true&characterEncoding=utf8"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "defaultFS": "hdfs://doitedu01:8020",
                        "fileType": "orc",
                        "path": "/user/hive/warehouse/test.db/stu/",
                        "fileName": "stu",
                        "column": [
                            {
                                "name": "id",
                                "type": "INT"
                            },
                            {
                                "name": "name",
                                "type": "STRING"
                            },
                            {
                                "name": "age",
                                "type": "INT"
                            },
                            {
                                "name": "gender",
                                "type": "STRING"
                            },
                            {
                                "name": "addr",
                                "type": "STRING"
                            }
                        ],
                        "writeMode": "append",
                        "fieldDelimiter": "\t",
                        "compress":"NONE"
                    }
                }
            }
        ]
    }
}

3.3 資料抽取策略

  • 和sqoop一樣,從結構化資料庫中抽取資料,最後需要根據資料庫表和資料總量,每日資料變化做抽取策略選擇.
  1. 如果是實體表,如果資料量比較小,一般每天或者一週,一個月抽取一份全量的表.
    如果是實體大表,一般每天抽取一份增量資料,然後按照分割槽表進行儲存.這類資料都是先放到ODS層.如果有需要,在DWD層每天做所有資料的滾動聚合,這時候DWD就有一份完整總數居.
  2. 事實表,如訂單,購物車等表.一般都是每天抽取一份增量資料,全量匯入沒必要,增量匯入,然後每天的資料以分割槽形式儲存.也是存放到ODS貼源層.
    如果需要做滾動合併,一般是在DWD層做每日資料滾動合併,這樣DWD就會有一份完整的總數居大表.
  3. 維度表,和實體表也是一樣,需要區分大表還是小表,一般10萬條或者100萬條以下算小表,具體標準每個公司差異可能很大.畢竟對於大資料處理來說,百萬條資料才到入門資料門檻.

小表——全量抽取
大表——增量抽取

4. 原理

  1. 架構在這裡插入圖片描述

在這裡插入圖片描述

  1. DataX本身作為離線資料同步框架,採用Framework + plugin架構構建。將資料來源讀取和寫入抽象成為Reader/Writer外掛,納入到整個同步框架中。
  2. Reader:Reader為資料採集模組,負責採集資料來源的資料,將資料傳送給Framework。
    Writer: Writer為資料寫入模組,負責不斷向Framework取資料,並將資料寫入到目的端。
    Framework:Framework用於連線reader和writer,作為兩者的資料傳輸通道,並處理緩衝,流控,併發,資料轉換等核心技術問題
    在這裡插入圖片描述
  1. 核心模組介紹
  • DataX完成單個資料同步的作業,我們稱之為Job,DataX接受到一個Job之後,將啟動一個程式來完成整個作業同步過程。DataX Job模組是單個作業的中樞管理節點,承擔了資料清理、子任務切分(將單一作業計算轉化為多個子Task)、TaskGroup管理等功能。
  • DataXJob啟動後,會根據不同的源端切分策略,將Job切分成多個小的Task(子任務),以便於併發執行。Task便是DataX作業的最小單元,每一個Task都會負責一部分資料的同步工作。
  • 切分多個Task之後,DataX Job會呼叫Scheduler模組,根據配置的併發資料量,將拆分成的Task重新組合,組裝成TaskGroup(任務組)。每一個TaskGroup負責以一定的併發執行完畢分配好的所有Task,預設單個任務組的併發數量為5。
  • 每一個Task都由TaskGroup負責啟動,Task啟動後,會固定啟動Reader—>Channel—>Writer的執行緒來完成任務同步工作。
  • DataX作業執行起來之後, Job監控並等待多個TaskGroup模組任務完成,等待所有TaskGroup任務完成後Job成功退出。否則,異常退出,程式退出值非0

如果大家對flume比較熟悉,可以看出跟flume的設計是很相似的.
datax並不做太多工作,只是匯入匯出,需要處理邏輯,在資料匯入匯出之前處理好或者資料匯入匯出之後處理好.

  1. DataX排程流程
    舉例來說,使用者提交了一個DataX作業,並且配置了20個併發,目的是將一個100張分表的mysql資料同步到odps裡面。DataX的排程決策思路是:
    DataXJob根據分庫分表切分成了100個Task。
    根據20個併發,DataX計算共需要分配4個TaskGroup。
    4個TaskGroup平分切分好的100個Task,每一個TaskGroup負責以5個併發共計執行25個Task。

  2. DataX支援的資料通道
    DataX目前已經有了比較全面的外掛體系,主流的RDBMS資料庫、NOSQL、大資料計算系統都已經接入,目前支援資料如下圖,詳情請點選:
    https://github.com/alibaba/DataX/blob/master/introduction.md
    在這裡插入圖片描述

5. 總結

  1. 對於大資料技術框架來說,總共就做幾件事情
  1. 資料採集
  2. 資料傳輸
  3. 資料儲存
  4. 資料分析與計算
  5. 資料結果儲存和展示
  1. sqoop datax等一般用於資料庫和大資料檔案儲存框架之間的資料匯入和匯出.注意匯入匯出是從大資料儲存框架角度來說的.
  2. flume等日誌採集框架,用於日誌檔案等半結構化資料和大資料檔案儲存框架之間的資料匯入和匯出.
  3. 針對HBase的資料匯入匯出,可以使用檔案形式,直接bulkload方式,也是一樣的.
  4. 其他框架按照功能劃分,也是一樣的道理. 不過當學會使用mapreduce或者spark 程式之後,其實這類簡單的資料匯入匯出功能,自己開發程式實現也是一樣的,不過通用性和健壯性會差一些.
  5. 實際企業開發中,遇到特殊的資料匯入和匯出,很多時候還是需要針對性編寫程式碼處理的.

相關文章