ETL工具--datax

datax是什么

  • 阿里開源的ETL工具(github地址:https://github.com/alibaba/DataX
    )瞻赶,ETL是描述從數(shù)據(jù)源讀取數(shù)據(jù)视乐,經(jīng)過轉換劫瞳,再加載到目的數(shù)據(jù)源的過程和媳,而datax是對這一過程的實現(xiàn)巴刻,采用framework+plugin框架模式。
    image.png
比對 ETL datax 功能
數(shù)據(jù)抽取 Extract Reader-plugin 從數(shù)據(jù)源讀取數(shù)據(jù)傍妒,傳輸?shù)絝ramework
轉換 transport Framework 對數(shù)據(jù)進行轉換幔摸、清洗、并發(fā)颤练、流量控制
數(shù)據(jù)寫入 load Writer-Plugin 從framework讀取數(shù)據(jù)既忆,寫入目標數(shù)據(jù)源

為什么選擇datax

  • 可靠穩(wěn)定,性能強,市場廣泛使用尿贫,經(jīng)得起時間和市場的考驗
  • 活躍的社區(qū),完善的使用文檔
  • 上手容易踏揣,配置簡單庆亡,學習成本低
  • 插件支持的數(shù)據(jù)源覆蓋范圍廣
  • 提供自定義插件擴展功能,可根據(jù)需求自主開發(fā)插件
  • 完善的運行日志打印與監(jiān)控捞稿,能夠迅速通過日志分析又谋、定位問題,例如總體的運行情況日志如下
任務啟動時刻                    : 2019-09-17 10:44:56
任務結束時刻                    : 2019-09-17 10:45:18
任務總計耗時                    :                 22s
任務平均流量                    :          492.72KB/s
記錄寫入速度                    :           8594rec/s
讀出記錄總數(shù)                    :              171895
讀寫失敗總數(shù)                    :                   0

datax的運行機制

image.png
  • job :數(shù)據(jù)同步的作業(yè)娱局,是datax運行最小業(yè)務單元
  • task:任務彰亥,job拆分出來的最小執(zhí)行單元
  • taskGroup:任務組,管理一組task的集合
  • jobContainer:任務容器衰齐,用于任務拆分任斋、調度,日志打印等工作
  • taskGroupContainer:任務執(zhí)行的容器

如何使用datax

$ python datax.py {YOUR_JOB.json}
  • datax.py是datax工具提供的python腳本耻涛,目錄{datax目錄/bin}
  • {YOUR_JOB.json} 是datax作業(yè)(job)的配置文件废酷,示例如下
{
#全局配置
    "core":{
        "transport":{
            "channel":{
                "speed":{
                    "channel": 2, #job任務通道數(shù),控制并發(fā)的線程數(shù)
                    "record":-1, #限制數(shù)據(jù)傳輸?shù)挠涗洈?shù)
                    "byte":-1, #限制數(shù)據(jù)傳輸?shù)牧髁看笮?                    "batchSize":2048 #限制批量讀取的size
                }
            }
        }
    },
#任務配置
    "job": {
        "content": [
            {
                  "reader": {
                    "name": "",#插件名稱
                    
                    "parameter": {
                        "connection": [#連接信息
                            {
                                "jdbcUrl": [""],
                                "querySql": [
                                    ""
                                ],
                                "table": [""]
                            }
                        ],
                         "column": [],
                         "splitPk":"",#分片鍵,
                         "where":"",#查詢限制條件
                        "password": "",
                        "username": "",
                    }
                },
                "writer": {
                    "name": "",
                    "parameter": {
                           "column": [],
                           "connection": [
                            {
                                
                                "jdbcUrl": "",
                                "table": [""]
                            }
                        ],
                        
                        "password": "",
                        "username": ""
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel":5,
                "record":1000,
            }, 
        "errorLimit": {#臟數(shù)據(jù)閾值配置
                "record":2,
                "percentage": 0.02
            }
        }
    }
}

datax的性能調優(yōu)

datax性能影響因素
  • 服務器性能:內存抹缕、存儲澈蟆,IO

  • 網(wǎng)絡環(huán)境:寬帶大小、網(wǎng)絡穩(wěn)定性

  • 配置文件參數(shù)的優(yōu)化

    • datax腳本運行時的內存大小配置
      python datax.py  --jvm '-Xms1G -Xmx1G'  {YOUR_JOB.json}
      
    • 調整job任務的限速卓研、限流及并發(fā)線程數(shù)
     "speed":{
                  "channel": 2, #job任務通道數(shù)趴俘,控制并發(fā)的線程數(shù)
                    "record":-1, #限制數(shù)據(jù)傳輸?shù)挠涗洈?shù)
                    "byte":-1, #限制數(shù)據(jù)傳輸?shù)牧髁看笮?                "batchSize":2048 #限制批量讀取的size
                }
     注:
     channel:并發(fā)數(shù),默認為5奏赘,即5個并發(fā)寥闪,每次可執(zhí)行task數(shù)為5
     例:channel配置為20個并發(fā),就需要4個taskGroup磨淌,如果作業(yè)有100個 
     task橙垢,那么每個group管理25個task。
     byte:限流伦糯,在帶寬允許條件下合理配置柜某,-1為不限制,往往會出現(xiàn)帶寬占用 
     過高的問題敛纲。
    

案例分析

問題:數(shù)據(jù)庫A的t_a表數(shù)據(jù)(275w數(shù)據(jù)量)同步到數(shù)據(jù)庫B的t_b表喂击,遷移邏輯:
image.png

表結構如下:

CREATE TABLE `t_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone` varchar(11) NOT NULL,
  `nick_name` varchar(45) DEFAULT NULL,
  `user_name` varchar(45) DEFAULT NULL,
  `sex` tinyint(2) DEFAULT NULL,
  `age` int(4) DEFAULT NULL,
  `created_user` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified_user` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `t_b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mobile` varchar(11) NOT NULL,
  `nick_name` varchar(45) DEFAULT NULL,
  `user_name` varchar(45) DEFAULT NULL,
  `sex` tinyint(2) DEFAULT NULL,
  `age` int(4) DEFAULT NULL,
  `created_user` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified_user` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
實現(xiàn)方案
  • 基礎datax腳本:

{
    "job": {
        "content": [
            {
                  "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "connection": [
                            {
                                "jdbcUrl": ["A"],
                                "querySql": [
                                    "SELECT id,phone,nick_name,user_name,sex,age,created_user,created_date,modified_user,modified_date from t_a"
                                ]
                            }
                        ],
                        "password": "",
                        "username": ""
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                           "column": ["id","mobile","nick_name","user_name","sex","age","created_user","created_date","modified_user","modified_date"],
                           "connection": [
                            {
                                
                                "jdbcUrl": "B",
                                "table": ["t_b"]
                            }
                        ],
                        "password": "",
                        "username": ""
                    }
                }
            }
        ]
    }
}
  • 執(zhí)行結果總體情況:
任務啟動時刻                    : 2019-09-18 14:38:12
任務結束時刻                    : 2019-09-18 14:41:53
任務總計耗時                    :                221s
任務平均流量                    :          251.45KB/s
記錄寫入速度                    :          12501rec/s
讀出記錄總數(shù)                    :             2750323
讀寫失敗總數(shù)                    :                   0
  • 對datax進行優(yōu)化,開啟多線程模式,channel配置必須與splitPk結合使用才能生效

{
    "job": {
        "content": [
            {
                  "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "column": ["id","mobile","nickname","username","gender","20 as age"],
                        "connection": [
                            {
                                "jdbcUrl": [""],
                                "table": ["tmp_member_all"]
                            }
                        ],
                        "splitPk":"id",
                        "password": "",
                        "username": ""
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                           "column": ["id","phone","nick_name","user_name","sex","age"],
                           "connection": [
                            {
                                
                                "jdbcUrl": "A",
                                "table": ["t_b"]
                            }
                        ],
                        "password": "",
                        "username": ""
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel":5
            }
        }
    }
}

任務執(zhí)行的總體情況

任務啟動時刻                    : 2019-09-18 15:02:58
任務結束時刻                    : 2019-09-18 15:03:59
任務總計耗時                    :                 61s
任務平均流量                    :          921.97KB/s
記錄寫入速度                    :          45838rec/s
讀出記錄總數(shù)                    :             2750323
讀寫失敗總數(shù)                    :                   0
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淤翔,隨后出現(xiàn)的幾起案子翰绊,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件监嗜,死亡現(xiàn)場離奇詭異谐檀,居然都是意外死亡,警方通過查閱死者的電腦和手機裁奇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門桐猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刽肠,你說我怎么就攤上這事溃肪。” “怎么了音五?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵惫撰,是天一觀的道長。 經(jīng)常有香客問我躺涝,道長厨钻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任坚嗜,我火速辦了婚禮莉撇,結果婚禮上,老公的妹妹穿的比我還像新娘惶傻。我一直安慰自己棍郎,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布银室。 她就那樣靜靜地躺著涂佃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜈敢。 梳的紋絲不亂的頭發(fā)上辜荠,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音抓狭,去河邊找鬼伯病。 笑死,一個胖子當著我的面吹牛否过,可吹牛的內容都是我干的午笛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼苗桂,長吁一口氣:“原來是場噩夢啊……” “哼药磺!你這毒婦竟也來了?” 一聲冷哼從身側響起煤伟,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤癌佩,失蹤者是張志新(化名)和其女友劉穎木缝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體围辙,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡我碟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姚建。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫俺。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥胞,靈堂內的尸體忽然破棺而出恳守,到底是詐尸還是另有隱情考婴,我是刑警寧澤贩虾,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站沥阱,受9級特大地震影響缎罢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜考杉,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一策精、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崇棠,春花似錦咽袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萎坷,卻和暖如春凹联,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哆档。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工蔽挠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓜浸。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓澳淑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親插佛。 傳聞我的和親對象是個殘疾皇子偶惠,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容