1、Sqoop基礎:鏈接關係型數據庫與Hadoop的橋樑html
Hadoop正成爲企業用於大數據分析的最熱門選擇,但想將你的數據移植過去並不容易。Apache Sqoop正在加緊幫助客戶將重要數據從數據庫移到Hadoop。隨着Hadoop和關係型數據庫之間的數據移動漸漸變成一個標準的流程,雲管理員們可以利用Sqoop的並行批量數據加載能力來簡化這一流程,下降編寫自定義數據加載腳本的需求。java
Apache Sqoop(SQL-to-Hadoop) 項目旨在協助 RDBMS 與 Hadoop 之間進行高效的大數據交流。用戶能夠在 Sqoop 的幫助下,輕鬆地把關係型數據庫的數據導入到 Hadoop 與其相關的系統 (如HBase和Hive)中;同時也能夠把數據從 Hadoop 系統裏抽取並導出到關係型數據庫裏。所以,能夠說Sqoop就是一個橋樑,鏈接了關係型數據庫與Hadoop。mysql
Sqoop中一大亮點就是能夠經過hadoop的mapreduce把數據從關係型數據庫中導入數據到HDFS。Sqoop架構很是簡單,其整合了Hive、Hbase和Oozie,經過map-reduce任務來傳輸數據,從而提供併發特性和容錯。Sqoop的基本工做流程以下圖所示:web
Sqoop在import時,須要制定split-by參數。Sqoop根據不一樣的split-by參數值來進行切分,而後將切分出來的區域分配到不一樣map中。每一個map中再處理數據庫中獲取的一行一行的值,寫入到HDFS中(由此也可知,導入導出的事務是以Mapper任務爲單位)。同時split-by根據不一樣的參數類型有不一樣的切分方法,如比較簡單的int型,Sqoop會取最大和最小split-by字段值,而後根據傳入的num-mappers來肯定劃分幾個區域。 好比select max(split_by),min(split-by) from獲得的max(split-by)和min(split-by)分別爲1000和1,而num-mappers爲2的話,則會分紅兩個區域(1,500)和(501-100),同時也會分紅2個sql給2個map去進行導入操做,分別爲select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最後每一個map各自獲取各自SQL中的數據進行導入工做。sql
(1)下載sqoop安裝包:這裏使用的是sqoop-1.4.5-cdh5.3.6.tar.gz版本。(下載:http://archive.cloudera.com/cdh5/cdh/5/)數據庫
(2)解壓sqoop安裝包:tar -zvxf sqoop-1.4.5-cdh5.3.6.tar.gz -C /opt/modulesvim
(3)設置環境變量:sudu vim /etc/profile ,增長如下內容服務器
#SQOOP_HOME
export SQOOP_HOME=/opt/modules/sqoop-1.4.5-cdh5.3.6
export PATH=$PATH:$SQOOP_HOME/bin架構
最後是環境變量生效:source /etc/profile併發
(4)將mysql的jdbc驅動mysql-connector-java-5.1.27-bin.jar複製到sqoop項目的lib目錄下:
cp mysql-connector-java-5.1.27-bin.jar /opt/modules/sqoop-1.4.5-cdh5.3.6/lib
(5)重命名配置文件:在${SQOOP_HOME}/conf中執行命令
mv sqoop-env-template.sh sqoop-env.sh
(6)【可選】修改配置文件:vim sqoop-env.sh
# Set Hadoop-specific environment variables here.
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6#set the path to where bin/hbase is available
#export HBASE_HOME=#Set the path to where bin/hive is available
export HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6#Set the path for where zookeper config dir is
#export ZOOCFGDIR=
(7) 啓動Sqoop (/opt/modules/sqoop-1.4.5-cdh5.3.6目錄下執行bin/sqoop help)
紅色標註部分爲Sqoop的全部命令,具體查看能夠經過bin/sqoop help 加字段的方式來查看。例如:bin/sqoop help import
Warning: /opt/modules/sqoop-1.4.5-cdh5.3.6/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /opt/modules/sqoop-1.4.5-cdh5.3.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/modules/sqoop-1.4.5-cdh5.3.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /opt/modules/sqoop-1.4.5-cdh5.3.6/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
18/03/01 10:57:23 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.6
usage: sqoop COMMAND [ARGS]Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import datasets from a mainframe server to HDFS
job Work with saved jobs
list-databases List available databases on a server
list-tables List available tables in a database
merge Merge results of incremental imports
metastore Run a standalone Sqoop metastore
version Display version informationSee 'sqoop help COMMAND' for information on a specific command.
這裏假設咱們已經在hadoop-master服務器中安裝了MySQL數據庫服務,並使用默認端口3306。須要注意的是,sqoop的數據庫驅動driver默認只支持mysql和oracle,若是使用sqlserver的話,須要把sqlserver的驅動jar包放在sqoop的lib目錄下,而後才能使用drive參數。
(1)MySQL數據源:mysql中的hive數據庫的Person_info表,這裏使用學習筆記17《Hive框架學習》裏邊Hive的數據庫表。
(2)使用import命令將mysql中的數據導入HDFS:
首先看看import命令的基本格式:
sqoop ##sqoop命令
import ##表示導入
--connect jdbc:mysql://ip:3306/sqoop ##告訴jdbc,鏈接mysql的url
--username root ##鏈接mysql的用戶名
--password admin ##鏈接mysql的密碼
--table mysql1 ##從mysql導出的表名稱
--fields-terminated-by '\t' ##指定輸出文件中的行的字段分隔符
-m 1 ##複製過程使用1個map做業
--hive-import ##把mysql表數據複製到hive空間中。若是不使用該選項,意味着複製到hdfs中
而後看看如何進行實戰:這裏將mysql中的Person_info表導入到hdfs中(/user/liupeng/sqoop/Person_Info/mysql_to_HDFS)
爲了更高效的顯示成果,咱們把sqoop的語句寫到一個文件中格式以下(文件地址:/opt/datas/sqoop_Demo/per_info_mysql_to_HDFS.sql)
import
--connect
jdbc:mysql://127.0.0.1:3306/liupeng
--username
root
--password
123456
--table
person_info
--target-dir
/user/liupeng/sqoop/Person_Info/mysql_to_HDFS
--num-mappers
1
最後看看是否成功導入了HDFS中:能夠看到Person_info表存入了1個map任務所生成的文件中,那是由於上述語句中--num-mappers指定了生成map的個數是1個。若是不指定會生成多個。若是數據量過大的狀況下不建議設置爲1
如下爲Hue集成HDFS文件系統的地址及文件內容。實際上Hadoop HDFS相同路徑下也一樣存在相同文件。
(1)既然要導出到MySQL,那麼首先得要有一張接收從HDFS導出數據的表。這裏爲了示範,還拿上面這個數據做例子。把已經存在HDFS上的Person_info數據從新export到mysql 數據庫中的test表裏。
(2)使用export命令進行將數據從HDFS導出到MySQL中,能夠看看export命令的基本格式。同inport案例相同。咱們把數據放到一個文件中而後經過bin/sqoop --options-file 文件路徑 的方式去傳輸數據。
export
--connect
jdbc:mysql://127.0.0.1:3306/liupeng
--username
root
--password
123456
--table
test
--export-dir
/user/liupeng/sqoop/Person_Info/mysql_to_HDFS注意:導出的數據表必須是事先存在的。並且格式必須跟HDFS文件系統要導出數據的文件格式相同才能夠。
(3)export實戰:將HDFS中的Person_info導出到mysql中的test數據表中。最後查看是否導入到了mysql中的TEST_IDS數據表中:
下列如圖所視,數據已經導入到mysql 數據庫的test表中了。至於爲何id的順序是錯開的,此處不做具體說明。能夠經過sqoop的語句指定更詳細的數據傳輸語句來解決這個問題。
(1)Sqoop的強大之處不只僅侷限與關係型數據庫跟HDFS文件系統之間的正反導入導出。也支持大數據倉庫Hive到Mysql及Mysql到Hive等的數據傳輸。接下來看2個案例分別演示mysql --> Hive, Hive -->Mysql的數據傳輸。至於其餘數據庫入HBase等的案例在往後學習過程當中更新。
案例1: Hive->MySQL
export --connect jdbc:mysql://127.0.0.1:3306/liupeng --username root --password 123456 --table test --export-dir /user/hive/warehouse/liupeng.db/test --fields-terminated-by '\t' --num-mappers 1
在此必須提早聲明的是--table test 爲mysql 中的test 表。而/user/hive/warehouse/liupeng.db/test是HDFS上的路徑而不是本地Local的路徑。在/user/hive/warehouse/liupeng.db/test目錄下必須有文件(hive中的表)。若是沒有必須事先經過hadoop的put命令先上傳到HDFS文件系統只上。
(2)在 sqoop目錄下經過 /bin/sqoop --options-file /opt/datas/sqoop_Demo/test_hive_to_mysql.sql 的方式去運行數據傳輸。
(3)最終查看數據是否已經成功導入到hive的test 表中。
案例2: MySQL --> Hive
(1) 首先在MySQL中把要準備的數據表準備好
(2) 一樣在hive中建立與MySQL數據表字段格式相同的表。(格式必須相同)
由於咱們這裏仍是拿上面Person_info種的數據做例子。所以在hive中要建立相同字段的表格。而後最後用‘\t’的方式指定表格式。
hive> create table person_info( > id int, > name string, > gender string, > birthday string, > address string, > nation string)row format delimited fields terminated by'\t';
(3) 數據準備好以後,把下列語句存放到/opt/datas/sqoop_Demo/mysql_to_hive.sql文件中。方便sqoop目錄下bin/sqoop --options-file 命令的調用。
import --connect jdbc:mysql://127.0.0.1:3306/liupeng --username root --password 123456 --table person_test --fields-terminated-by '\t' --delete-target-dir --num-mappers 1 --hive-import --hive-database liupeng --hive-table person_info
(4) 查看數據是否已經正常顯示在Hive的person_info表中。(此處一樣經過Hue的web界面展現)
(1) 以上的案例已經充分的證實了sqoop功能的強大,固然不光能夠實現關係形數據庫和Hadoop HDFS,Hive之間的正反數據表的導入導出,同時同MySQL語句同樣,也支持部分字段的導入導出。這裏只做一個案例展現。
案例:
<1> 一樣在/opt/datas/sqoop_Demo目錄下準備一個文件,編輯要傳輸的sqoop語句。此處命名爲perinfo_columns_to_HDFS.sql
import --connect jdbc:mysql://127.0.0.1:3306/liupeng --username root --password 123456 --table person_info --target-dir /user/liupeng/sqoop/sqlcolumns_to_HDFS/Person_info_test --num-mappers 1 --columns id,name,gender,address
<2> 在sqoop目錄下執行 bin/sqoop --options-file /opt/datas/sqoop_Demo/perinfo_columns_to_HDFS.sql
<3> 在HDFS文件系統 /user/liupeng/sqoop/sqlcolumns_to_HDFS/Person_info_test目錄下查看是否文件被導入進來。此處經過Hue界面展現
對於上述MySQL數據表部分數據導入到HDFS文件系統上的方法。還能夠經過Sqoop 中Query語句方法來實現。而這個方法更像咱們MySQL數據中的語句直接來使用。一塊兒看一下下列的案例。
案例
<1> Query 文件的編寫。同上目錄下建立query_to_HDFS.sql文件並編寫語句
import --connect jdbc:mysql://127.0.0.1:3306/liupeng --username root --password 123456 --query select id,name from person_info where $CONDITIONS --target-dir /user/liupeng/sqoop/query/Person_info --num-mappers 1
<2> 一樣在Sqoop目錄下執行 --options-file 指定該文件
<3> 查看結果(Hue界面下查看)
另外補充一句,若是select 語句選擇字段同時想要加入where條件的話請在句末添加以下。
import
--connect
jdbc:mysql://127.0.0.1:3306/liupeng
--username
root
--password
123456
--query
select id,name,address from person_info where $CONDITIONS and id >5 and id<21
--target-dir
/user/liupeng/sqoop/query/Person_info
--num-mappers
1
查看結果
以上爲Sqoop的基本命令使用。固然Sqoop的強大功能遠不只如此。實際工做中按照不一樣的需求來選擇不一樣的方式來進行數據的導入導出。具體細節方法能夠參照Sqoop的官網及API。