Mysql 與 hadoop 數據同步(遷移),你須要知道 Sqoop

上篇文章 Mysql 到 Hbase 數據如何實時同步,強大的 Streamsets 告訴你 咱們說到了如何使用 Streamsets 來進行 mysql 到 hbase 的數據實時同步(遷移)。使用 Streamsets 的優勢是部署簡單,配置靈活,無需編寫代碼。mysql

認真閱讀上篇文章的朋友會發現,Streamsets 可以實時跟蹤數據的變化,將數據同步更新到 hbase 中。可是對於歷史數據(而且數據不改動的記錄)的同步,文章中並無說起到。固然,並非由於 Streamsets 不能從事這些事情,而是筆者暫時沒有使用它來進行歷史數據的遷移。所以,對於歷史數據的遷移,筆者今天來介紹另一個工具 - Sqoop。相對於 Streamsets,你們應該更加熟悉 Sqoop。sql

若是你工做中須要將關係型數據庫(Mysql、Oracle等等)中的數據同步到 hadoop(HDFS、hive、hbase) 中,或者將 hadoop 中的數據同步到關係型數據庫中,那這篇文章應該能幫助到你。shell

注:Streamsets 以及 Sqoop 都屬於數據同步、遷移方面比較流行的解決方案,相似的工具還有不少,好比 Datax、kettle 等等,從事數據方面工做的朋友能夠去多多瞭解,找到適合本身工做場景的方案。數據庫

認識一下

Sqoop 的命名,仔細一看是否是有點像 sql 和 hadoop 兩個詞語的拼接產物。其實從它的命名來看也就很明顯:它是用來將關係型數據庫和 Hadoop 中的數據進行相互轉移的工具,而且這種轉換是雙向的。看下圖就能一目瞭然: apache

從關係型數據庫到 hadoop 咱們稱之爲 import,從 hadoop 到關係型數據庫咱們稱之爲 export。文章後面你們就會看到 "import"、"export" 對應命令的兩個模式。api

安裝

對於 Sqoop 的安裝,這裏就不作介紹了,網上有不少的教程,由於是一個工具,因此安裝起來也是很方便簡單。須要注意的是 Sqoop 有兩個大的版本:Sqoop一、Sqoop2。安全

訪問 Sqoop 官網 ,官網上的 1.4.x 的爲 Sqoop1, 1.99.* 爲 Sqoop2。bash

關於 Sqoop1 與 Sqoop2 的區別,通俗來說就是:併發

  1. sqoop1 只是一個客戶端工具,Sqoop2 加入了 Server 來集中化管理鏈接器
  2. Sqoop1 經過命令行來工做,工做方式單一,Sqoop2 則有更多的方式來工做,好比 REST api接口、Web 頁
  3. Sqoop2 加入權限安全機制

對於筆者來講,Sqoop 就是一個同步工具,命令行足夠知足工做需求,而且大部分數據同步都是在同一個局域網內部(也就沒有數據安全之類問題),因此選擇的是 Sqoop1(具體版本是 1.4.6)oracle

框架原理

經過上圖能夠看出, 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 目錄下的一個個可運行腳本文件,若是想了解細節,能夠打開這些腳本進行查看

工做中通常經常使用的幾個操做或者命令以下:

  1. list-databases : 查看有哪些數據庫
  2. list-tables : 查看數據庫中有哪些表
  3. import : 關係型數據庫到 hadoop 數據同步
  4. export : hadoop 到關係型數據庫數據同步
  5. version :查看 Sqoop 版本

列出數據庫

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 : 數據庫的 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

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'
複製代碼

首先進入 hbase shell,建立好 namespace 以及 數據庫。database_tmp 位命名空間,table_tmp 爲數據庫。

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 : 制定導出哪些列

hive 到 mysql

瞭解 hive 的朋友都知道,hive 的真實數據其實就是 hdfs 磁盤上的數據,因此 hive 到 mysql 的同步操做與 hdfs 到 mysql 的操做相似

hbase 到 mysql

目前 Sqoop 沒有提供直接將 hbase 數據同步到 mysql 的操做

總結: 在 sql to hadoop 和 hadoop to sql 這種數據同步場景,Sqoop 是一個頗有效且靈活的工具,你們不妨使用它來從事數據方面的工做。

相關文章
相關標籤/搜索