一.sqoop的簡單概論
1.sqoop產(chǎn)生的原因:
A. 多數(shù)使用hadoop技術(shù)的處理大數(shù)據(jù)業(yè)務(wù)的企業(yè)拒担,有大量的數(shù)據(jù)存儲(chǔ)在關(guān)系型數(shù)據(jù)中鲤孵。
B. 由于沒有工具支持兆旬,對hadoop和關(guān)系型數(shù)據(jù)庫之間數(shù)據(jù)傳輸是一個(gè)很困難的事脖岛。
依據(jù)以上的原因sqoop產(chǎn)生的舍沙。
2. sqoop的介紹
sqoop是連接關(guān)系型數(shù)據(jù)庫和hadoop的橋梁近上,主要有兩個(gè)方面(導(dǎo)入和導(dǎo)出):
A. 將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入到Hadoop 及其相關(guān)的系統(tǒng)中,如 Hive和HBase
B. 將數(shù)據(jù)從Hadoop 系統(tǒng)里抽取并導(dǎo)出到關(guān)系型數(shù)據(jù)庫
3.Sqoop的優(yōu)點(diǎn):
A. 可以高效拂铡、可控的利用資源壹无,可以通過調(diào)整任務(wù)數(shù)來控制任務(wù)的并發(fā)度。
B. 可以自動(dòng)的完成數(shù)據(jù)映射和轉(zhuǎn)換感帅。由于導(dǎo)入數(shù)據(jù)庫是有類型的斗锭,它可以自動(dòng)根據(jù)數(shù)據(jù)庫中的類型轉(zhuǎn)換到Hadoop 中,當(dāng)然用戶也可以自定義它們之間的映射關(guān)系
C.支持多種數(shù)據(jù)庫失球,如mysql岖是,orcale等數(shù)據(jù)庫
4. sqoop工作的機(jī)制:
將導(dǎo)入或?qū)С雒罘g成MapReduce程序來實(shí)現(xiàn)在翻譯出的,MapReduce 中主要是對InputFormat和OutputFormat進(jìn)行定制
5. sqoop版本介紹:sqoop1和sqoop2
A. sqoop的版本sqoop1和sqoop2是兩個(gè)不同的版本,它們是完全不兼容的
B. 版本劃分方式: apache1.4.X之后的版本是1,1.99.0之上的版本是2
C. Sqoop2相比sqoop1的優(yōu)勢有:
1) 它引入的sqoop Server实苞,便于集中化的管理Connector或者其它的第三方插件豺撑;
2) 多種訪問方式:CLI、Web UI黔牵、REST API聪轿;
3) 它引入了基于角色的安全機(jī)制,管理員可以在sqoop Server上配置不同的角色猾浦。
D. Sqoop2和sqoop1的功能性對比:
E. sqoop1和sqoop2的架構(gòu)區(qū)別:
1)sqoop1的架構(gòu)圖:
版本號(hào):1.4.X以后的sqoop1
在架構(gòu)上:sqoop1使用sqoop客戶端直接提交代碼方式
訪問方式:CLI命令行控制臺(tái)方式訪問
安全性:命令或者腳本指定用戶數(shù)據(jù)庫名和密碼
原理:Sqoop工具接收到客戶端的shell命令或者Java api命令后陆错,通過Sqoop中的任務(wù)翻譯器(Task Translator)將命令轉(zhuǎn)換為對應(yīng)的MapReduce任務(wù),而后將關(guān)系型數(shù)據(jù)庫和Hadoop中的數(shù)據(jù)進(jìn)行相互轉(zhuǎn)移金赦,進(jìn)而完成數(shù)據(jù)的拷貝
2)sqoop2架構(gòu)圖:
版本號(hào):1.99.X以上的版本sqoop2
在架構(gòu)上:sqoop2引入了 sqoop server,對對connector實(shí)現(xiàn)了集中的管理訪問方式:REST API音瓷、 JAVA API、 WEB UI以及CLI控制臺(tái)方式進(jìn)行訪問?
CLI方式訪問夹抗,會(huì)通過交互過程界面绳慎,輸入的密碼信息會(huì)被看到,同時(shí)Sqoop2引入基亍角色的安全機(jī)制兔朦,Sqoop2比Sqoop多了一個(gè)Server端偷线。
F. Sqoop1和sqoop2優(yōu)缺點(diǎn):
sqoop1優(yōu)點(diǎn):架構(gòu)部署簡單
sqoop1缺點(diǎn):命令行方式容易出錯(cuò),格式緊耦合沽甥,無法支持所有數(shù)據(jù)類型声邦,安全機(jī)制不夠完善,例如密碼暴漏摆舟,安裝需要root權(quán)限亥曹,connector必須符合JDBC模型
sqoop2優(yōu)點(diǎn):多種交互方式邓了,命令行,web UI媳瞪,rest API骗炉,conncetor集中化管理,所有的鏈接安裝在sqoop server上蛇受,完善權(quán)限管理機(jī)制句葵,connector規(guī)范化,僅僅負(fù)責(zé)數(shù)據(jù)的讀寫
sqoop2缺點(diǎn):sqoop2的缺點(diǎn)兢仰,架構(gòu)稍復(fù)雜乍丈,配置部署更繁瑣
二.安裝sqoop1:
1. 安裝前提:
Sqoop需要安裝在hive,hbase的服務(wù)器上把将,linux環(huán)境中必須有java和hadoop環(huán)境
Java 1.8.0_161
Hadoop ?2.8.5
2. 下載軟件:
軟件下載地址:http://mirrors.hust.edu.cn/apache/sqoop
此處下載的軟件是sqoop1的軟件包:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
3. 安裝sqoop:
A. 解壓:
tar xf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 /usr/local/sqoop
B. 修改配置文件:
cd /usr/local/sqoop/conf
cp sqoop-env-template.sh ?sqoop-env.sh
vim ?sqoop-env.sh
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
注意:為什么在sqoop-env.sh文件中會(huì)要求分別進(jìn)行 common和mapreduce的配置呢
在apache的hadoop的安裝中四大組件都是安裝在同一個(gè)hadoop_home中的轻专,但是在CDH, HDP中, 這些組件都是可選的察蹲。在安裝hadoop的時(shí)候请垛,可以選擇性的只安裝HDFS或者YARN。CDH,HDP在安裝hadoop的時(shí)候洽议,會(huì)把HDFS和MapReduce有可能分別安裝在不同的地方宗收。
CDH(Cloudera’s Distribution, including Apache Hadoop),是Hadoop眾多分支中的一種绞铃,由Cloudera維護(hù)镜雨,基于穩(wěn)定版本的Apache Hadoop構(gòu)建,并集成了很多補(bǔ)丁儿捧,可直接用于生產(chǎn)環(huán)境
HDP(Hortonworks Data Platform)是hortworks推出的100%開源的hadoop發(fā)行版本,以YARN 作為其架構(gòu)中心荚坞,包含pig、hive菲盾、phoniex颓影、hbase、storm懒鉴、spark等大量組件诡挂,在最新的2.4版本,監(jiān)控UI實(shí)現(xiàn)與grafana集成
C. 將mysql的驅(qū)動(dòng)包放到sqoop的lib目錄下
cp ?mysql-connector-java-5.1.46.jar /usr/local/sqoop/lib
D. 修改環(huán)境變量:
export SQOOP_HOME=/usr/local/sqoop
export PATH=$SQOOP_HOME/bin:$PATH
4.安裝顯示:
三.Sqoop的使用
1. 查看數(shù)據(jù)庫的名稱:
sqoop list-databases --connect jdbc:mysql://ip:3306/ --username 用戶名--password 密碼
2. 列舉出數(shù)據(jù)庫中的表名:
sqoop list-tables --connect jdbc:mysql://ip:3306/數(shù)據(jù)庫名稱?--username 用戶名?--password 密碼
3. 導(dǎo)入:
sqoop import ?
--connect jdbc:mysql://ip:3306/databasename ?#指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的數(shù)據(jù)庫名
--table ?tablename ?#要讀取數(shù)據(jù)庫database中的表名???????????
--username root ?????#用戶名?
--password ?123456 ?#密碼????
--target-dir ??/path ?#指的是HDFS中導(dǎo)入表的存放目錄(注意:是目錄)
--fields-terminated-by '\t' ??#設(shè)定導(dǎo)入數(shù)據(jù)后每個(gè)字段的分隔符临谱,默認(rèn)璃俗;分隔
--lines-terminated-by '\n'????#設(shè)定導(dǎo)入數(shù)據(jù)后每行的分隔符
--m 1 ?#并發(fā)的map數(shù)量1,如果不設(shè)置默認(rèn)啟動(dòng)4個(gè)map task執(zhí)行數(shù)據(jù)導(dǎo)入,則需要指定一個(gè)列來作為劃分map task任務(wù)的依據(jù)
-- where ’查詢條件‘ ??#導(dǎo)入查詢出來的內(nèi)容悉默,表的子集
--incremental ?append ?#增量導(dǎo)入
--check-column:column_id ??#指定增量導(dǎo)入時(shí)的參考列
--last-value:num ??#上一次導(dǎo)入column_id的最后一個(gè)值
--null-string ‘’ ??#導(dǎo)入的字段為空時(shí)城豁,用指定的字符進(jìn)行替換
以上導(dǎo)入到hdfs中
--hive-import ???#導(dǎo)入到hive
--hive-overwrite ??#可以多次寫入
--hive-database ?databasename ??#創(chuàng)建數(shù)據(jù)庫,如果數(shù)據(jù)庫不存在的必須寫抄课,默認(rèn)存放在default中
--create-hive-table ??#sqoop默認(rèn)自動(dòng)創(chuàng)建hive表
--delete-target-dir ?#刪除中間結(jié)果數(shù)據(jù)目錄
--hive-table tablename ??#創(chuàng)建表名
4. 導(dǎo)入所有的表放到hdfs中:
sqoop import-all-tables ?--connect jdbc:mysql://ip:3306/庫名 --username 用戶名 ?--password ?密碼 ?--target-dir 導(dǎo)入存放的目錄
5. 導(dǎo)出(目標(biāo)表必須在mysql數(shù)據(jù)庫中已經(jīng)建好唱星,數(shù)據(jù)存放在hdfs中):
sqoop export
--connect jdbs:mysql://ip:3600/庫名 #指定JDBC的URL 其中database指的是(Mysql或者Oracle)中的數(shù)據(jù)庫名
--username用戶名 ?#數(shù)據(jù)庫的用戶名
--password密碼 ????#數(shù)據(jù)庫的密碼
--table表名 ???????#需要導(dǎo)入到數(shù)據(jù)庫中的表名
--export-dir導(dǎo)入數(shù)據(jù)的名稱 ???#hdfs上的數(shù)據(jù)文件
--fields-terminated-by ‘\t’ ??????#HDFS中被導(dǎo)出的文件字段之間的分隔符
--lines-terminated-by '\n'????#設(shè)定導(dǎo)入數(shù)據(jù)后每行的分隔符
--m 1 ?#并發(fā)的map數(shù)量1,如果不設(shè)置默認(rèn)啟動(dòng)4個(gè)map task執(zhí)行數(shù)據(jù)導(dǎo)入雳旅,則需要指定一個(gè)列來作為劃分map task任務(wù)的依據(jù)
--incremental ?append ?#增量導(dǎo)入
--check-column:column_id ??#指定增量導(dǎo)入時(shí)的參考列
--last-value:num ??#上一次導(dǎo)入column_id的最后一個(gè)值
--null-string ‘’ ??#導(dǎo)出的字段為空時(shí),用指定的字符進(jìn)行替換
6. 創(chuàng)建和維護(hù)sqoop作業(yè):sqoop作業(yè)創(chuàng)建并保存導(dǎo)入和導(dǎo)出命令间聊。
A.創(chuàng)建作業(yè):
sqoop job --create作業(yè)名 -- import --connect jdbc:mysql://ip:3306/數(shù)據(jù)庫 --username 用戶名 --table 表名 --password 密碼 --m 1 --target-dir ?存放目錄
注意加粗的地方是有空格的
B. 驗(yàn)證作業(yè)(顯示已經(jīng)保存的作業(yè)):
sqoop job ?--list
C. 顯示作業(yè)詳細(xì)信息:
sqoop ?job --show作業(yè)名稱
D.刪除作業(yè):
sqoop ?job ?--delete作業(yè)名
E. 執(zhí)行作業(yè):
sqoop ?job --exec作業(yè)
7. eval:它允許用戶針對各自的數(shù)據(jù)庫服務(wù)器執(zhí)行用戶定義的查詢攒盈,并在控制臺(tái)中預(yù)覽結(jié)果,可以使用期望導(dǎo)入結(jié)果數(shù)據(jù)哎榴。
A.選擇查詢:
sqoop eval -connect jdbc:mysql://ip:3306/數(shù)據(jù)庫 --username 用戶名 ?--password 密碼 --query ”select * from emp limit 1“
B.插入查詢:
sqoop eval ?jdbc:mysql://ip:3306/數(shù)據(jù)庫 --username 用戶名 ?--password 密碼?--query "insert into emp values(4,'ceshi','hebei')"
8.codegen:從面向?qū)ο蟮膽?yīng)用程序的角度來看碍扔,每個(gè)數(shù)據(jù)庫表都有一個(gè)DAO類酸些,它包含用于初始化對象的'getter'和'setter'方法汽馋。該工具(-codegen)自動(dòng)生成DAO類醉拓。
它根據(jù)表模式結(jié)構(gòu)在Java中生成DAO類。Java定義被實(shí)例化為導(dǎo)入過程的一部分驼壶。這個(gè)工具的主要用途是檢查Java是否丟失了Java代碼。如果是這樣喉酌,它將使用字段之間的默認(rèn)分隔符創(chuàng)建Java的新版本,其實(shí)就是生成表名.java
語法:sqoop codegen --connectjdbc:mysql://ip:3306/數(shù)據(jù)庫 --username 用戶名 --table 表名 --m 1 --password 密碼
回顯中會(huì)顯示文件存放的位置热凹。