上篇文章 Mysql 到 Hbase 數(shù)據(jù)如何實(shí)時同步,強(qiáng)大的 Streamsets 告訴你 我們說到了如何使用 Streamsets 來進(jìn)行 mysql 到 hbase 的數(shù)據(jù)實(shí)時同步(遷移)。使用 Streamsets 的優(yōu)點(diǎn)是部署簡單兰粉,配置靈活焊唬,無需編寫代碼恋昼。
認(rèn)真閱讀上篇文章的朋友會發(fā)現(xiàn),Streamsets 能夠?qū)崟r跟蹤數(shù)據(jù)的變化赶促,將數(shù)據(jù)同步更新到 hbase 中液肌。但是對于歷史數(shù)據(jù)(并且數(shù)據(jù)不改動的記錄)的同步,文章中并沒有提及到鸥滨。當(dāng)然嗦哆,并不是因?yàn)?Streamsets 不能從事這些事情谤祖,而是筆者暫時沒有使用它來進(jìn)行歷史數(shù)據(jù)的遷移。因此老速,對于歷史數(shù)據(jù)的遷移粥喜,筆者今天來介紹另外一個工具 - Sqoop。相對于 Streamsets橘券,大家應(yīng)該更加熟悉 Sqoop额湘。
如果你工作中需要將關(guān)系型數(shù)據(jù)庫(Mysql、Oracle等等)中的數(shù)據(jù)同步到 hadoop(HDFS旁舰、hive锋华、hbase) 中,或者將 hadoop 中的數(shù)據(jù)同步到關(guān)系型數(shù)據(jù)庫中箭窜,那這篇文章應(yīng)該能幫助到你毯焕。
注:Streamsets 以及 Sqoop 都屬于數(shù)據(jù)同步、遷移方面比較流行的解決方案磺樱,類似的工具還有很多纳猫,比如 Datax、kettle 等等坊罢,從事數(shù)據(jù)方面工作的朋友可以去多多了解续担,找到適合自己工作場景的方案。
認(rèn)識一下
Sqoop 的命名活孩,仔細(xì)一看是不是有點(diǎn)像 sql 和 hadoop 兩個詞語的拼接產(chǎn)物物遇。其實(shí)從它的命名來看也就很明顯:它是用來將關(guān)系型數(shù)據(jù)庫和 Hadoop 中的數(shù)據(jù)進(jìn)行相互轉(zhuǎn)移的工具,并且這種轉(zhuǎn)換是雙向的憾儒⊙耍看下圖就能一目了然:
從關(guān)系型數(shù)據(jù)庫到 hadoop 我們稱之為 import,從 hadoop 到關(guān)系型數(shù)據(jù)庫我們稱之為 export。文章后面大家就會看到 "import"起趾、"export" 對應(yīng)命令的兩個模式诗舰。
安裝
對于 Sqoop 的安裝,這里就不做介紹了训裆,網(wǎng)上有很多的教程眶根,因?yàn)槭且粋€工具,所以安裝起來也是很方便簡單边琉。需要注意的是 Sqoop 有兩個大的版本:Sqoop1属百、Sqoop2。
訪問 Sqoop 官網(wǎng) 变姨,官網(wǎng)上的 1.4.x 的為 Sqoop1, 1.99.* 為 Sqoop2族扰。
關(guān)于 Sqoop1 與 Sqoop2 的區(qū)別,通俗來講就是:
- sqoop1 只是一個客戶端工具,Sqoop2 加入了 Server 來集中化管理連接器
- Sqoop1 通過命令行來工作渔呵,工作方式單一怒竿,Sqoop2 則有更多的方式來工作,比如 REST api接口扩氢、Web 頁
- Sqoop2 加入權(quán)限安全機(jī)制
對于筆者來說耕驰,Sqoop 就是一個同步工具,命令行足夠滿足工作需求录豺,并且大部分?jǐn)?shù)據(jù)同步都是在同一個局域網(wǎng)內(nèi)部(也就沒有數(shù)據(jù)安全之類問題)耍属,所以選擇的是 Sqoop1(具體版本是 1.4.6)
框架原理
通過上圖可以看出, Sqoop Client 通過 shell 命令來使用 sqoop, sqoop 中的 Task Translater 將命令轉(zhuǎn)換成 hadoop 中的 mapreduce 任務(wù)進(jìn)行具體的數(shù)據(jù)操作」欤可以這樣理解,例如 Mysql 中某個表數(shù)據(jù)同步到 hadoop 這個場景示启,Sqoop 會將表記錄分成多份兢哭,每份分到各自 mapper 中去進(jìn)行落地 hadoop(保證同步效率)。大家可能發(fā)現(xiàn)夫嗓,其實(shí)這里的 mapreduce 沒有 reduce,只有 map迟螺。
實(shí)操
了解了 Sqoop 是什么,能做什么以及大概的框架原理舍咖,接下來我們直接使用 Sqoop 命令來感受一下使用 Sqoop 是如何簡單及有效矩父。本文案例中的關(guān)系型數(shù)據(jù)庫使用的是 mysql,oracle 以及其他使用 jdbc 連接的關(guān)系型數(shù)據(jù)庫操作類似排霉,差別不大窍株。
運(yùn)行 sqoop help 可以看到 Sqoop 提供了哪些操作,如下圖
這些操作其實(shí)都會一一對應(yīng)到 sqoop bin 目錄下的一個個可運(yùn)行腳本文件,如果想了解細(xì)節(jié)攻柠,可以打開這些腳本進(jìn)行查看
工作中一般常用的幾個操作或者命令如下:
- list-databases : 查看有哪些數(shù)據(jù)庫
- list-tables : 查看數(shù)據(jù)庫中有哪些表
- import : 關(guān)系型數(shù)據(jù)庫到 hadoop 數(shù)據(jù)同步
- export : hadoop 到關(guān)系型數(shù)據(jù)庫數(shù)據(jù)同步
- version :查看 Sqoop 版本
列出數(shù)據(jù)庫
sqoop list-databases --connect jdbc:mysql://192.168.1.123:3306/ --username root --password 12345678
列出表
sqoop list-databases --connect jdbc:mysql://192.168.1.123:3306/databasename --username root --password 12345678
mysql 到 hdfs
sqoop import
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root
--password 12345678
--table tablename
--target-dir /hadoopDir/
--fields-terminalted-by '\t'
-m 1
--check-column id
--last-value num
--incremental append
--connect : 數(shù)據(jù)庫的 JDBC URL,后面的 databasename 想要連接的數(shù)據(jù)庫名稱
--table : 數(shù)據(jù)庫表
--username : 數(shù)據(jù)庫用戶名
--password : 數(shù)據(jù)庫密碼
--target-dir : HDFS 目標(biāo)目錄
--fields-terminated-by :數(shù)據(jù)導(dǎo)入后每個字段之間的分隔符
-m :mapper 的并發(fā)數(shù)量
--check-column : 指定增量導(dǎo)入時的參考列球订,這里是 id (主鍵)
--last-value : 上一次導(dǎo)入的最后一個值
--incremental append :導(dǎo)入方式為增量
注意:工作中需要增量同步的場景下,我們就可以使用 --incremental append 以及 --last-value瑰钮。比如這里我們使用 id 來作為參考列冒滩,如果上次同步到了 1000, 這次我們想只同步新的數(shù)據(jù)浪谴,就可以帶上參數(shù) --last-value 1000开睡。
mysql 到 hive
使用 imort --create-hive-table
sqoop import
--create-hive-table
-m 1
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root
--password 12345678
--table tablename
--hive-import
--hive-database databasename_hive
--hive-overwrite
--hive-table tablename_hive
mysql 到 hbase
hbase shell
create_namespace 'database_tmp'
create 'database_tmp:table_tmp','info'
sqoop import
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username 'root'
--password '12345678'
--table 'tablename'
--hbase-table 'database_tmp:table_tmp'
--hbase-row-key 'id'
--column-family 'info'
首先進(jìn)入 hbase shell,創(chuàng)建好 namespace 以及 數(shù)據(jù)庫。database_tmp 位命名空間苟耻,table_tmp 為數(shù)據(jù)庫篇恒。
hdfs 到 mysql
sqoop export
--connect jdbc:mysql://192.168.1.123:3306/databasename
--username root
--password '12345678'
--table tablename
--m 1
--export-dir /hadoopDir/
--input-fields-terminated-by '\t'
--columns="column1,column2"
--columns : 制定導(dǎo)出哪些列
hive 到 mysql
了解 hive 的朋友都知道,hive 的真實(shí)數(shù)據(jù)其實(shí)就是 hdfs 磁盤上的數(shù)據(jù)梁呈,所以 hive 到 mysql 的同步操作與 hdfs 到 mysql 的操作類似
hbase 到 mysql
目前 Sqoop 沒有提供直接將 hbase 數(shù)據(jù)同步到 mysql 的操作
總結(jié): 在 sql to hadoop 和 hadoop to sql 這種數(shù)據(jù)同步場景婚度,Sqoop 是一個很有效且靈活的工具,大家不妨使用它來從事數(shù)據(jù)方面的工作。