MySQL 與 Hadoop 資料同步之 Sqoop 詳解
上篇文章 Mysql 到 Hbase 資料如何實時同步,強大的 Streamsets 告訴你 我們說到了如何使用 Streamsets 來進行 mysql 到 hbase 的資料實時同步(遷移)。使用 Streamsets 的優點是部署簡單,配置靈活,無需編寫程式碼。
認真閱讀上篇文章的朋友會發現,Streamsets 能夠實時跟蹤資料的變化,將資料同步更新到 hbase 中。但是對於歷史資料(並且資料不改動的記錄)的同步,文章中並沒有提及到。當然,並不是因為 Streamsets 不能從事這些事情,而是筆者暫時沒有使用它來進行歷史資料的遷移。因此,對於歷史資料的遷移,筆者今天來介紹另外一個工具 - Sqoop。相對於 Streamsets,大家應該更加熟悉 Sqoop。
如果你工作中需要將關係型資料庫(Mysql、Oracle等等)中的資料同步到 hadoop(HDFS、hive、hbase) 中,或者將 hadoop 中的資料同步到關係型資料庫中,那這篇文章應該能幫助到你。
注:Streamsets 以及 Sqoop 都屬於資料同步、遷移方面比較流行的解決方案,類似的工具還有很多,比如 Datax、kettle 等等,從事資料方面工作的朋友可以去多多瞭解,找到適合自己工作場景的方案。
認識一下
Sqoop 的命名,仔細一看是不是有點像 sql 和 hadoop 兩個詞語的拼接產物。其實從它的命名來看也就很明顯:它是用來將關係型資料庫和 Hadoop 中的資料進行相互轉移的工具,並且這種轉換是雙向的。看下圖就能一目瞭然:
從關係型資料庫到 hadoop 我們稱之為 import,從 hadoop 到關係型資料庫我們稱之為 export。文章後面大家就會看到 "import"、"export" 對應命令的兩個模式。
安裝
對於 Sqoop 的安裝,這裡就不做介紹了,網上有很多的教程,因為是一個工具,所以安裝起來也是很方便簡單。需要注意的是 Sqoop 有兩個大的版本:Sqoop1、Sqoop2。
訪問 Sqoop 官網 ,官網上的 1.4.x 的為 Sqoop1, 1.99.* 為 Sqoop2。
關於 Sqoop1 與 Sqoop2 的區別,通俗來講就是:
-
sqoop1 只是一個客戶端工具,Sqoop2 加入了 Server 來集中化管理聯結器
-
Sqoop1 通過命令列來工作,工作方式單一,Sqoop2 則有更多的方式來工作,比如 REST api介面、Web 頁
-
Sqoop2 加入許可權安全機制
對於筆者來說,Sqoop 就是一個同步工具,命令列足夠滿足工作需求,並且大部分資料同步都是在同一個區域網內部(也就沒有資料安全之類問題),所以選擇的是 Sqoop1(具體版本是 1.4.6)
框架原理
通過上圖可以看出, Sqoop Client 通過 shell 命令來使用 sqoop, sqoop 中的 Task Translater 將命令轉換成 hadoop 中的 mapreduce 任務進行具體的資料操作。可以這樣理解,例如 Mysql 中某個表資料同步到 hadoop 這個場景,Sqoop 會將表記錄分成多份,每份分到各自 mapper 中去進行落地 hadoop(保證同步效率)。大家可能發現,其實這裡的 mapreduce 沒有 reduce,只有 map。
實操
瞭解了 Sqoop 是什麼,能做什麼以及大概的框架原理,接下來我們直接使用 Sqoop 命令來感受一下使用 Sqoop 是如何簡單及有效。本文案例中的關係型資料庫使用的是 mysql,oracle 以及其他使用 jdbc 連線的關係型資料庫操作類似,差別不大。
執行 sqoop help 可以看到 Sqoop 提供了哪些操作,如下圖
這些操作其實都會一一對應到 sqoop bin 目錄下的一個個可執行指令碼檔案,如果想了解細節,可以開啟這些指令碼進行檢視
工作中一般常用的幾個操作或者命令如下:
-
list-databases : 檢視有哪些資料庫
-
list-tables : 檢視資料庫中有哪些表
-
import : 關係型資料庫到 hadoop 資料同步
-
export : hadoop 到關係型資料庫資料同步
-
version :檢視 Sqoop 版本
列出資料庫
列出表
mysql 到 hdfs
--connect : 資料庫的 JDBC URL,後面的 databasename 想要連線的資料庫名稱
--table : 資料庫表
--username : 資料庫使用者名稱
--password : 資料庫密碼
--target-dir : HDFS 目標目錄
--fields-terminated-by :資料匯入後每個欄位之間的分隔符
-m :mapper 的併發數量
--check-column : 指定增量匯入時的參考列,這裡是 id (主鍵)
--last-value : 上一次匯入的最後一個值
--incremental append :匯入方式為增量
注意:工作中需要增量同步的場景下,我們就可以使用 --incremental append 以及 --last-value。比如這裡我們使用 id 來作為參考列,如果上次同步到了 1000, 這次我們想只同步新的資料,就可以帶上引數 --last-value 1000。
mysql 到 hive
使用 imort --create-hive-table
mysql 到 hbase
首先進入 hbase shell,建立好 namespace 以及 資料庫。database tmp 位名稱空間,table tmp 為資料庫。
hdfs 到 mysql
--columns : 制定匯出哪些列
hive 到 mysql
瞭解 hive 的朋友都知道,hive 的真實資料其實就是 hdfs 磁碟上的資料,所以 hive 到 mysql 的同步操作與 hdfs 到 mysql 的操作類似
hbase 到 mysql
目前 Sqoop 沒有提供直接將 hbase 資料同步到 mysql 的操作
總結: 在 sql to hadoop 和 hadoop to sql 這種資料同步場景,Sqoop 是一個很有效且靈活的工具,大家不妨使用它來從事資料方面的工作。