100-BigData-28Sqoop

上一篇:099-BigData-27數據倉庫

一、Sqoop簡介

Apache Sqoop(TM)是一種旨在有效地在Apache Hadoop和諸如關系數據庫等結構化數據存儲之間傳輸大量數據的工具。
Sqoop于2012年3月孵化出來,現在是一個頂級的Apache項目。
請注意,1.99.7與1.4.6不兼容,且沒有特征不完整,它并不打算用于生產部署。

二、Sqoop原理

將導入或導出命令翻譯成mapreduce程序來實現。
在翻譯出的mapreduce中主要是對inputformat和outputformat進行定制。

三、Sqoop安裝

安裝Sqoop的前提是已經具備Java和Hadoop的環境。

3.1、下載并解壓

  1. 最新版下載地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.7/

  2. 上傳安裝包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虛擬機中,如我的上傳目錄是:/opt/software/

  3. 解壓sqoop安裝包到指定目錄,如:

$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/

3.2、修改配置文件
Sqoop的配置文件與大多數大數據框架類似,在sqoop根目錄下的conf目錄中。

  1. 重命名配置文件
$ mv sqoop-env-template.sh sqoop-env.sh
$ mv sqoop-site-template.xml sqoop-site.xml 此行不用做
  1. 修改配置文件
    sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.8.4
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.8.4
export HIVE_HOME=/opt/module/hive
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export ZOOCFGDIR=/opt/module/zookeeper-3.4.10/conf

3.3、拷貝JDBC驅動
拷貝jdbc驅動到sqoop的lib目錄下,如:

$ cp -a mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib

3.4、驗證Sqoop
我們可以通過某一個command來驗證sqoop配置是否正確:

$ bin/sqoop help
出現一些Warning警告(警告信息已省略),并伴隨著幫助命令的輸出:
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
  version            Display version information
·····

注:注釋掉configure-sqoop 134行到143行的內容,內容如下

134 ## Moved to be a runtime check in sqoop.
     135 #if [ ! -d "${HCAT_HOME}" ]; then
    136 #  echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
    137 #  echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
    138 #fi
    139 #
    140 #if [ ! -d "${ACCUMULO_HOME}" ]; then
    141 #  echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
    142 #  echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
    143 #fi

3.5、測試Sqoop是否能夠成功連接數據庫

$ bin/sqoop list-databases --connect jdbc:mysql://bigdata113:3306/ --username root --password 000000
出現如下輸出:
information_schema
metastore
mysql
performance_schema

四、Sqoop的簡單使用案例

4.1、導入數據
在Sqoop中,“導入”概念指:從非大數據集群(RDBMS)向大數據集群(HDFS,HIVE,HBASE)中傳輸數據,叫做:導入,即使用import關鍵字。
4.1.1、RDBMS到HDFS

  1. 確定Mysql服務開啟正常
  2. 在Mysql中新建一張表并插入一些數據
$ mysql -uroot -p000000
mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');
  1. 導入數據
    (1)全部導入
$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table student \
--target-dir /user/test/student1 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

(2)查詢導入

$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--target-dir /user/test/student \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from student where id <=6 and $CONDITIONS;'

尖叫提示:must contain 'CONDITIONS' in WHERE clause. 注:CONDITIONS 翻譯‘條件’ 尖叫提示:如果query后使用的是雙引號,則CONDITIONS前必須加轉移符,防止shell識別為自己的變量。
(3)導入指定列

$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--target-dir /user/test/student \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,name \
--table student

尖叫提示:columns中如果涉及到多列,用逗號分隔,分隔時不要添加空格
(4)使用sqoop關鍵字篩選查詢導入數據

$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--target-dir /user/test/student \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table student \
--where "id=2"

尖叫提示:在Sqoop中可以使用sqoop import -D property.name=property.value這樣的方式加入執行任務的參數,多個參數用空格隔開。
4.1.2、RDBMS到Hive

$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table student \
--delete-target-dir \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table student_hive

尖叫提示:該過程分為兩步,第一步將數據導入到HDFS,第二步將導入到HDFS的數據遷移到Hive倉庫
尖叫提示:從MYSQL到Hive,本質時從MYSQL => HDFS => load To Hive
4.2、導出數據
在Sqoop中,“導出”概念指:從大數據集群(HDFS,HIVE,HBASE)向非大數據集群(RDBMS)中傳輸數據,叫做:導出,即使用export關鍵字。
4.2.1、HIVE/HDFS到RDBMS

創建aca表
create table abc(id int,name VARCHAR(5));
$ bin/sqoop export \
--connect jdbc:mysql://bigdata111:3306/test characterEncoding=utf-8\
--username root \
--password 000000 \
--export-dir /user/hive/warehouse/student_hive \
--table student1 \
--num-mappers 1 \
--input-fields-terminated-by "\t"

尖叫提示:Mysql中如果表不存在,不會自動創建,自行根據表結構創建
尖叫提示:重復往mysql的統一個表中導出數據,mysql的表不能設置主鍵和自增。
尖叫提示:如果數據導出mysql中是“??”那么添加characterEncoding=utf-8
思考:數據是覆蓋還是追加 答案:追加
4.3、腳本打包
使用opt格式的文件打包sqoop命令,然后執行

  1. 創建一個.opt文件
$ touch job_HDFS2RDBMS.opt
  1. 編寫sqoop腳本
$ vi ./job_HDFS2RDBMS.opt
#以下命令是從staff_hive中追加導入到mysql的aca表中

export
--connect
jdbc:mysql://bigdata112:3306/test
--username
root
--password
000000
--table
student
--num-mappers
1
--export-dir
/user/hive/warehouse111/student_hive
--input-fields-terminated-by
"\t"
  1. 執行該腳本
$ bin/sqoop --options-file job_HDFS2RDBMS.opt

五、Sqoop一些常用命令及參數

5.1、常用命令列舉
這里給大家列出來了一部分Sqoop操作時的常用參數,以供參考,需要深入學習的可以參看對應類的源代碼。

image.png

5.2、命令&參數詳解
剛才列舉了一些Sqoop的常用命令,對于不同的命令,有不同的參數,讓我們來一一列舉說明。
首先來我們來介紹一下公用的參數,所謂公用參數,就是大多數命令都支持的參數。

5.2.1、公用參數:數據庫連接

image.png

5.2.2、公用參數:import

image.png

5.2.3、公用參數:export

image.png

5.2.4、公用參數:hive

image.png

公用參數介紹完之后,我們來按照命令介紹命令對應的特有參數。

5.2.5、命令&參數:import
將關系型數據庫中的數據導入到HDFS(包括Hive,HBase)中,如果導入的是Hive,那么當Hive中沒有對應表時,則自動創建。

  1. 命令:
    如:導入數據到hive中
$ bin/sqoop import \
--connect jdbc:mysql://bigdata113:3306/test \
--username root \
--password 000000 \
--table access \
--hive-import \
--fields-terminated-by "\t"

如:增量導入數據到hive中,mode=append

append導入:
$ bin/sqoop import \
--connect jdbc:mysql://bigdata111:3306/test \
--username root \
--password 000000 \
--table student \
--num-mappers 1 \
--fields-terminated-by "\t" \
--target-dir /user/hive/warehouse111/student_hive \
--check-column id \
--incremental append \
--last-value 10

尖叫提示:append不能與--hive-等參數同時使用(Append mode for hive imports is not yet supported. Please remove the parameter --append-mode)
注:--last-value 2 的意思是標記增量的位置為第二行,也就是說,當數據再次導出的時候,從第二行開始算
注:如果 --last-value N , N > MYSQL中最大行數,則HDFS會創建一個空文件。如果N<=0 , 那么就是所有數據

如:增量導入數據到hdfs中,mode=lastmodified(注:卡?。?/p>

先在mysql中建表并插入幾條數據:
mysql> create table staff_timestamp(id int(4), name varchar(255), sex varchar(255), last_modified timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
mysql> insert into staff_timestamp (id, name, sex) values(1, 'AAA', 'female');
mysql> insert into staff_timestamp (id, name, sex) values(2, 'BBB', 'female');
先導入一部分數據:
$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table staff_timestamp \
--delete-target-dir \
--hive-import \
--fields-terminated-by "\t" \
--m 1
再增量導入一部分數據:
mysql> insert into staff_timestamp (id, name, sex) values(3, 'CCC', 'female');
$ bin/sqoop import \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table staff_timestamp \
--check-column last_modified \
--incremental lastmodified \
--m 1 \
--last-value "2019-07-16 06:44:12" \
--append \
--fields-terminated-by "\t" \
--warehouse-dir /user/hive/warehouse/

尖叫提示:使用lastmodified方式導入數據要指定增量數據是要--append(追加)還是要--merge-key(合并)
尖叫提示:在Hive中,如果不指定輸出路徑,可以去看以下兩個目錄
/user/root(此為用戶名)
/user/hive/warehouse 個人配置的目錄
尖叫提示:last-value指定的值是會包含于增量導入的數據中
如果卡住,在yarn-site.xml中加入以下配置

<property>
     <name>yarn.nodemanager.resource.memory-mb</name>
     <value>20480</value>
 </property>

 <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>2048</value>
 </property>

 <property>
     <name>yarn.nodemanager.vmem-pmem-ratio</name>
     <value>2.1</value>
 </property>
  1. 參數:
image.png
image.png

5.2.6、命令&參數:export
從HDFS(包括Hive和HBase)中將數據導出到關系型數據庫中。

  1. 命令:
    如:
bin/sqoop export \
--connect jdbc:mysql://bigdata113:3306/test \
--username root \
--password 000000 \
--export-dir /user/hive/warehouse/staff_hive \
--table aca \
--num-mappers 1 \
--input-fields-terminated-by "\t"
  1. 參數:
image.png

5.2.7、命令&參數:codegen
將關系型數據庫中的表映射為一個Java類,在該類中有各列對應的各個字段。
如:

$ bin/sqoop codegen \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table student \
--bindir /root/student \
--class-name Student \
--fields-terminated-by "\t"
image.png

5.2.8、命令&參數:create-hive-table
生成與關系數據庫表結構對應的hive表結構。
命令:
如:僅建表

$ bin/sqoop create-hive-table \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table student \
--hive-table hive_student

參數:

image.png

5.2.9、命令&參數:eval
可以快速的使用SQL語句對關系型數據庫進行操作,經常用于在import數據之前,了解一下SQL語句是否正確,數據是否正常,并可以將結果顯示在控制臺。
命令:
如:

$ bin/sqoop eval \
--connect jdbc:mysql://bigdata11:3306/test \
--username root \
--password 000000 \
--query "SELECT * FROM student"

參數:

image.png

5.2.10、命令&參數:import-all-tables
可以將RDBMS中的所有表導入到HDFS中,每一個表都對應一個HDFS目錄
命令:
如:注意:(卡住)

$ bin/sqoop import-all-tables \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--hive-import \
--fields-terminated-by "\t"

bin/sqoop-import-all-tables --connect jdbc:mysql://bigdata111:3306/test --username root --password 000000 --as-textfile --warehouse-dir /user/root/plus -m 1

參數:

image.png

5.2.11、命令&參數:job
用來生成一個sqoop任務,生成后不會立即執行,需要手動執行。
命令:
如:

$ bin/sqoop job \
 --create myjob -- import-all-tables \
 --connect jdbc:mysql://bigdata112:3306/test \
 --username root \
 --password 000000

$ bin/sqoop job \
--list
$ bin/sqoop job \
--exec myjob1

尖叫提示:注意import-all-tables和它左邊的--之間有一個空格
尖叫提示:如果需要連接metastore,則--meta-connect
執行的結果在HDFS:/user/root/ 目錄中,即導出所有表到/user/root中
參數:

image.png

尖叫提示:在執行一個job時,如果需要手動輸入數據庫密碼,可以做如下優化

<property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
    <description>If true, allow saved passwords in the metastore.</description>
</property>

5.2.12、命令&參數:list-databases
命令:
如:

$ bin/sqoop list-databases \
--connect jdbc:mysql://bigdata113:3306/ \
--username root \
--password 000000

參數:與公用參數一樣

5.2.13、命令&參數:list-tables
命令:
如:

$ bin/sqoop list-tables \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000

參數:與公用參數一樣

5.2.14、命令&參數:merge
將HDFS中不同目錄下面的數據合并在一起并放入指定目錄中
數據環境:注意:以下數據自己手動改成\t
new_staff

1 AAA male
2 BBB male
3 CCC male
4 DDD male
old_staff

1 AAA female
2 CCC female
3 BBB female
6 DDD female

尖叫提示:上邊數據的列之間的分隔符應該為\t,行與行之間的分割符為\n,如果直接復制,請檢查之。
命令:
如:

創建JavaBean:
$ bin/sqoop codegen \
--connect jdbc:mysql://bigdata112:3306/test \
--username root \
--password 000000 \
--table student \
--bindir /opt/Desktop/student \
--class-name Student \
--fields-terminated-by "\t"

開始合并:注:是hdfs路徑
$ bin/sqoop merge \
--new-data /new/ \
--onto /old/ \
--target-dir /test/merged1 \
--jar-file /opt/Desktop/student/Student.jar \
--class-name Student \
--merge-key id
結果:
1   AAA MALE
2   BBB MALE
3   CCC MALE
4   DDD MALE
6   DDD FEMALE

參數:

image.png

5.2.15、命令&參數:metastore
記錄了Sqoop job的元數據信息,如果不啟動該服務,那么默認job元數據的存儲目錄為~/.sqoop,可在sqoop-site.xml中修改。
命令:
如:啟動sqoop的metastore服務

$ bin/sqoop metastore

參數:

image.png

下一篇:101-BigData-29Azkaban

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • Sqoop是一種用于在Hadoop和關系數據庫或大型機之間傳輸數據的工具。您可以使用Sqoop從關系數據庫管理系統...
    糧憶雨閱讀 2,170評論 0 2
  • 1/列出mysql數據庫中的所有數據庫sqoop list-databases -connect jdbc:mys...
    時待吾閱讀 2,749評論 1 5
  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴展性。 Spark沒有存儲能力。 Spark的Ma...
    Yobhel閱讀 7,300評論 0 34
  • 墓碣文中的自己,往往要比事實中的更加真實,這是生命結束后,別人對你最直白的評論,扶心自食,預知本味,創痛酷烈,...
    施晨曦同學閱讀 531評論 0 0
  • 又一次見證了上界的絕妙安排。雖然已經無數次,卻次次都不得不佩服與驚嘆! 在療愈的道路上,我面對了在其它道路上同樣的...
    小妖Genie閱讀 857評論 0 0