使用Sqoop job工具同步資料
我們使用的是Sqoop-1.4.4,在進行關係型資料庫與Hadoop/Hive資料同步的時候,如果使用--incremental
選項,如使用append模式,我們需要記錄一個--last-value
的值,如果每次執行同步指令碼的時候,都需要從日誌中解析出來這個--last-value
的值,然後重新設定指令碼引數,才能正確同步,保證從關係型資料庫同步到Hadoop/Hive的資料不發生重複的問題。
而且,我們我們需要管理我們使用的這些指令碼,每次執行之前可能要獲取指定引數值,或者修改引數。Sqoop也提供了一種比較方面的方式,那就是直接建立一個Sqoop job,通過job來管理特定的同步任務。就像我們前面提到的增量同步問題,通過建立sqoop job可以儲存上一次同步時記錄的--last-value
sqoop job命令使用
Sqoop job相關的命令有兩個:
- bin/sqoop job
- bin/sqoop-job
使用這兩個都可以。我們先看看sqoop job命令的基本用法:
- 建立job:
--create
- 刪除job:
--delete
- 執行job:
--exec
- 顯示job:
--show
- 列出job:
--list
下面,我們基於增量同步資料這個應用場景,建立一個sqoop job,命令如下所示:
1 |
|
建立了job,id為“your-sync-job”,它是將MySQL資料庫workflow中的project表同步到Hive表中,而且--incremental append
--last-value
為1,從MySQL表中自增主鍵id=1開始同步。然後我們根據這個job的id去查詢job詳細配置情況:
1 |
|
結果示例,如下所示:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
通過incremental.last.value = 1可以看到,通過該選項來控制增量同步開始記錄。
接著,可以使用建立的這個job id來執行它,執行如下命令:
1 |
|
可以查詢,MySQL資料庫workflow中的project表中的資料被同步到Hive表中。
這時,可以通過bin/sqoop job --show your-sync-job
命令,檢視當前的sqoop job配置情況,可以看到如下變化:
1 |
|
從MySQL表中增量同步的起始id變為7,下次同步就會把id大於7的記錄同步到Hive表中。可以在MySQL表中再INSERT一條記錄,再次執行your-sync-job,能夠正確地進行增量同步。
Sqoop job安全配置
預設情況下,建立的每個job在執行的時候都不會進行安全的認證。如果我們希望限制指定的sqoop job的執行,只有經過認證以後才能執行,這時候可以使用sqoop job的安全選項。Sqoop安裝目錄下,通過修改配置檔案conf/sqoop-site.xml可以對job進行更高階的配置。實際上,我們使用了Sqoop的metastore工具,它能夠對Sqoop進行細粒度的配置。
我們要將MySQL資料庫中的資料同步到Hive表,每次執行sqoop job都需要輸入訪問MySQL資料庫的連線賬號資訊,可以設定sqoop.metastore.client.record.password的值為true。如果在conf/sqoop-site.xml中增加如下配置,會將連線賬號資訊儲存到Sqoop的metastore中:
1 2 3 4 5 |
|
如果想要限制從外部呼叫執行Sqoop job,如將Sqoop job提交給Oozie排程程式,也會通過上面Sqoop的metastore配置的內容來進行驗證。
另外,Sqoop的metastore工具,可以允許我們指定為外部,例如使用外部主機上的MySQL資料庫來儲存元資料,可以在conf/sqoop-site.xml配置如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 |
|
還有一個可與選擇的配置項是,可以設定是否自動連線到外部metastore資料庫,通過如下配置指定:
1 2 3 4 5 6 |
|
這樣,你可以通過MySQL的授權機制,來限制指定的使用者和主機(或IP地址)訪問Sqoop的metadata,也能起到一定的安全訪問限制。
參考連結