章節內容
上節我們完成了如下的內容:
- Sqoop MySQL遷移到Hive
- Sqoop Hive遷移數據到MySQL
- 編寫腳本進行數據導入導出測試
背景介紹
這里是三臺公網云服務器,每臺 2C4G,搭建一個Hadoop的學習環境,供我學習。
之前已經在 VM 虛擬機上搭建過一次,但是沒留下筆記,這次趁著前幾天薅羊毛的3臺機器,趕緊嘗試在公網上搭建體驗一下。
- 2C4G 編號 h121
- 2C4G 編號 h122
- 2C2G 編號 h123
CDC
全稱為:變化數據捕獲(Change Data Capture)
我們前面執行的都是全量數據
的導入。
- 如果
數據量很小
,則
采取完全源數據
抽取 -
- 如果
源數據量很大
,則需要抽取
發生變化的數據
,這種數據抽取模式叫:“變化數據捕獲”,簡稱 CDC。
- 如果
如果
CDC是侵入式
的,那么操作會給源系統帶來性能的影響
。
基于時間戳
抽取過程可以根據某些屬性列來判斷
哪些數據是增量
的,最常見的屬性列
有以下兩種:
- 時間戳:最好有兩個列,一個插入時間戳,表示何時創建,一個更新時間戳表示最后一次更新時間。
- 序列:大多數數據庫都提供自增功能,表中的列定義成自增的,很容易得根據該列識別新插入的數據
時間戳
是最簡單
且常用的,但是有如下缺點
:
不能
記錄刪除記錄的操作無法
識別多次更新不具有
實時的能力
基于觸發器
當執行:INSERT
、UPDATE
、DELTE
這些 SQL 語句時,激活數據庫的觸發器,使用觸發器可捕獲變更的數據,并把數據保存中間臨時表里。
大多數場合下,不允許向操作性數據庫里添加觸發器,且這種會降低系統性能,基本不會采用。
基于快照
可以通過比較源表
和快照表
來得到數據的變化,基于快照的CDC可以檢測插入、更新、刪除等數據,這是相對于時間戳的CDC方案的優點。
缺點
就是需要大量的空間
。
基于日志
最復雜
和沒有侵入性
的就是基于日志
的方式,數據庫把每個插入、更新、刪除都記錄到日志里,解析日志文件,就可以獲取相關的信息。
每個關系型數據庫:日志格式不一致
,沒有通用
的產品。
阿里巴巴的Canal
可以完成MySQL
日志文件解析。
Append方式
初始化數據
刪除 MySQL 中的數據
-- 刪除 MySQL 表中的全部數據
truncate table sqoop.goodtbl;
刪除Hive中的數據
-- 刪除 Hive 表中的全部數據
truncate table mydb.goodtbl;
重新生成數據
這個SQL是之前章節寫的函數方法,如果你第一次看到這里,你可能需要把前邊的文章執行一次。
-- 向MySQL的表中插入100條數據
call batchInsertTestData(1, 100);
導入Hive
sqoop import \
--connect jdbc:mysql://h122.wzk.icu:3306/sqoop \
--username hive --password hive@wzk.icu \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 50 \
-m 1
以上參數說明:
- check-column 用來指定一些列,來檢查是否可以作為增量數據進行導入,和關系型數據庫自增或時間戳類似。
- last-value 制定上一次導入檢查列指定字段的最大值
檢查Hive
我們通過指令查看 Hive 同步了多少數據過來:
select count(*) from mydb.goodtbl;
繼續生成
call batchInsertTestData(200, 1000);
增量導入
sqoop import \
--connect jdbc:mysql://h122.wzk.icu:3306/sqoop \
--username hive --password hive@wzk.icu \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 100 \
-m 1
檢查Hive
重新查看Hive,看看目前同步了多少數據過來
select count(*) from mydb.goodtbl;