ETL,是英文 Extract-Transform-Load 的縮寫,用來描述將數據從來源端經過抽取(extract)、轉換(transform)、加載(load)至目的端的過程。
ETL工具或類ETL的數據集成同步工具或語言,企業生產中工具也非常之多,主流的etl工具有Sqoop、DataX、Canal、flume、Logstash、kettle、DataStage、Informatica、Talend等,語言有強悍的SQL、Shell、Python、Java、Scala等。而數據源多為業務系統,埋點日志,離線文件,第三方數據等。
數據同步之道
01. sqoop
Sqoop,SQL-to-Hadoop 即 “SQL到Hadoop和Hadoop到SQL”。
是Apache開源的一款在Hadoop和關系數據庫服務器之間傳輸數據的工具。主要用於在Hadoop與關系型數據庫之間進行數據轉移,可以將一個關系型數據庫(MySQL ,Oracle等)中的數據導入到Hadoop的HDFS中,也可以將HDFS的數據導出到關系型數據庫中。
sqoop命令的本質是轉化為MapReduce程序。sqoop分為導入(import)和導出(export),策略分為table和query,模式分為增量和全量。
命令簡單示例:
02. DataX
DataX 是阿里巴巴集團內被廣泛使用的離線數據同步工具/平台,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各種異構數據源之間高效的數據同步功能。
github地址:https://github.com/alibaba/DataX
支持數據源:
DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader+Writer插件,納入到整個同步框架中。
目前已到datax3.0框架設計:
datax使用示例,核心就是編寫json配置文件job:
03. kettle
Kettle,中文名:水壺,是一款國外免費開源的、可視化的、功能強大的ETL工具,純java編寫,可以在Windows、Linux、Unix上運行,數據抽取高效穩定。
Kettle家族目前包括4個產品:Spoon、Pan、CHEF、Kitchen。
Kettle的最大特點:
-
免費開源:基於Java免費開源軟件
-
易配置:可跨平台,綠色無需安裝
-
不同數據庫:ETL工具集,可管理不同數據庫的數據
-
兩種腳本文件:transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制
-
圖形界面設計:托拉拽,無需寫代碼
-
定時功能:在Job下的start模塊,有一個定時功能,可以每日,每周等方式進行定時
福利:需要Kettle資源教程視頻的同學,公眾號后台回復關鍵字:kettle,即可獲取哦~
04. canal
canal是阿里巴巴旗下的一款開源項目,純Java開發。基於數據庫增量日志解析,提供增量數據實時訂閱和消費,目前主要支持了MySQL,也支持mariaDB。
很多大型的互聯網項目生產環境中使用,包括阿里、美團等都有廣泛的應用,是一個非常成熟的數據庫同步方案,基礎的使用只需要進行簡單的配置即可。
github地址:https://github.com/alibaba/canal
當前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
canal是通過模擬成為mysql 的slave的方式,監聽mysql 的binlog日志來獲取數據,binlog設置為row模式以后,不僅能獲取到執行的每一個增刪改的腳本,同時還能獲取到修改前和修改后的數據,基於這個特性,canal就能高性能的獲取到mysql數據數據的變更。
05. StreamSets
Streamsets是一個大數據實時采集ETL工具,可以實現不寫一行代碼完成數據的采集和流轉。通過拖拽式的可視化界面,實現數據管道(Pipelines)的設計和定時任務調度。
數據源支持MySQL、Oracle等結構化和半/非結構化,目標源支持HDFS、Hive、Hbase、Kudu、Solr、Elasticserach等。創建一個Pipelines管道需要配置數據源(Origins)、操作(Processors)、目的地(Destinations)三部分。
Streamsets的強大之處:
-
拖拽式可視化界面操作,No coding required 可實現不寫一行代碼
-
強大整合力,100+ Ready-to-Use Origins and Destinations,支持100+數據源和目標源
-
可視化內置調度監控,實時觀測數據流和數據質量
二、ETL之技術棧
2.1 工具
重工具,kettle、DataStage、Informatica 三大工具依舊牢牢穩固傳統數倉三大主力位置。kettle與時俱進,在大數據數倉,如一些互聯網公司也有在使用kettle。
工具本文不再多做介紹。
2.2 語言
開發語言,傳統數倉一般SQL/Shell為主,互聯網數倉又對Python、Java、Scala提出了新的要求。
不管是傳統數倉,還是基於Hadoop生態的構建的(hive、spark、flink)數倉,SQL雖然戲碼在下降,但依然是重頭戲。強大的存儲過程,更是屹立不倒,這么多年都在熠熠生輝。
善於發現的你,一定會發現,在大數據生態,不管哪種數據處理框架,總有一天都會孵化出強大SQL的支持。如Hive SQL,Spark SQL,Blink SQL 等。此時,你或許會得出一個結論:
SQL是最好的語言!(不接受反駁。。)
對於SQL,基本技能也是必備技能。
各種join、嵌套/標量子查詢,強大的分析/窗口函數,變化無窮的正則表達式,層次查詢,擴展分組,MODEL,遞歸with,多維分析,排列組合,行列互轉,json解析,執行計划,四大類型(dql、dml、ddl、dcl)等,依然需要每個etl·er熟悉掌握。
SQLjoin,left/rignt/full join,每一個join都是暗藏韻理,on和where也不容小覷。
分析函數 簡捷高效,4類30+個分析/窗口函數最全總結,感興趣的同學請移步:SQL分析函數,看這一篇就夠了 (點擊鏈接即可)。
SQL開發規范和執行計划也需要每個erl·er在實際實踐中不斷加強、提煉、升級。
SQL開發規范 示例:
如果你還在傳統數倉領域,如果你還想將薪比薪,建議趕緊開始學Java、scala,擁抱大數據生態Hadoop/Spark/Flink,機會總是垂青有准備的人。
三、ETL加載策略
數據集成加載策略,按類型可包括快照、流水、增量、全量、拉鏈等。
01. 增量
有些表巨大,我們需要選擇增量策略,新增delta數據需要和存量數據merge合並。欣賞並學習兩種處理方式,直接上圖,可斟酌體會:
(如果看圖不能理解,來數倉ers群里,加入高手如雲,我們一起探討!加小助微:iom1128,備注:ETL)
Merge方式(一)
Merge方式(二)
1)只有新增數據
2)新增+刪除
02. 全量
每天一個全量表,也可一個分區一個全量。
03. 拉鏈
拉鏈表,記錄數據生命周期,記錄一條數據生命周期的開始和結束。
建議在設計拉鏈表的時候不僅要有開始時間和結束時間,最好再加一個生命狀態字段,如chain_status:有效 active、失效 expired、歷史 history。
回想一下前面文章介紹的緩慢變化維,可類比SCD的TYPE2,有異曲同工之處
全量拉鏈,或許會存在性能問題,故建議根據實際業務場景中進行取舍,可只和最近一個時間周期(eg:1個月)的進行拉鏈處理。
四、結束語
學思想,數據思維;
學Java,走大數據;
學實時,不怕被淘汰!