Sqoop的安裝和使用
所用環(huán)境的版本:
- CentOS 7.9
- Hadoop 2.9.2(已搭建集群)
- Hive 2.3.6
- Mysql 5.7.28
一:概述
Sqoop 是 apache 旗下一款“Hadoop 和關(guān)系數(shù)據(jù)庫(kù)服務(wù)器之間傳送數(shù)據(jù)”的工具。
核心的功能有兩個(gè):導(dǎo)入夹界、導(dǎo)出
本文檔用于記錄 Sqoop的安裝和使用搀崭。
建議
先配置好Hadoop的JobHistory節(jié)點(diǎn)
兆龙,以便于在Web中的Yarn界面查看MapReduce任務(wù)日志信息。
二:Sqoop安裝
1.前提概述
- Sqoop就是一個(gè)工具贤牛, 只需要在一個(gè)節(jié)點(diǎn)上進(jìn)行安裝即可靠汁。
- 你安裝的Sqoop軟件的節(jié)點(diǎn)一定要包含你要使用的集群或者軟件系統(tǒng)的安裝包
2. 軟件下載
注意:
下載
sqoop-xx.bin__xx.tar.gz
的安裝壓縮包。Sqoop 1 和Sqoop 2不兼容健提,且絕大部分企業(yè)所使用的Sqoop的版本是 Sqoop 1。
? 1.4.7版本的為Sqoop 1
? 1.99.7版本的為Sqoop 2
三:安裝
1.創(chuàng)建sqoop安裝目錄
mkdir /usr/local/sqoop
2.解壓安裝包到指定目錄
上傳解壓縮安裝包到指定目錄(此處跳過(guò)了Ftp傳輸步驟)伟叛。
因?yàn)橹癶ive只是安裝在hadoop1機(jī)器上私痹,所以Sqoop也同樣安裝在hadoop1機(jī)器上。
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz /usr/local/sqoop
3.修改配置文件
-
進(jìn)入到 conf 文件夾中,復(fù)制sqoop-env-template.sh紊遵,并將其修改為sqoop-env.sh
cp sqoop-env-template.sh sqoop-env.sh
-
修改sqoop-env.sh
vi sqoop-env.sh
export HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-2.9.2 #Hadoop的MapReduce安裝路徑 export HADOOP_COMMON_HOME=/usr/local/hadoop/hadoop-2.9.2 #Hadoop的Common安裝路徑 export HIVE_HOME=/usr/local/hive/hive #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有可能分別安裝在不同的地方会放。
-
將Mysql驅(qū)動(dòng)包放到 lib 文件夾下
cp mysql-connector-java-5.1.48-bin.jar /usr/local/sqoop/sqoop-1.4.7/lib/
-
配置環(huán)境變量
vi /etc/profile
#在末尾處添加以下行 export SQOOP_HOME=/usr/local/sqoop/sqoop-1.4.7 export PATH=${PATH}:${SQOOP_HOME}/bin
#使文件生效 source /etc/profile
-
驗(yàn)證是否安裝成功
sqoop version
四:Sqoop的基本命令
#查看命令
sqoop help
#運(yùn)行結(jié)果:
usage: sqoop COMMAND [ARGS]
Available commands:
#生成與數(shù)據(jù)庫(kù)記錄交互的代碼
codegen Generate code to interact with database records
#將表定義導(dǎo)入到Hive中
create-hive-table Import a table definition into Hive
#計(jì)算一個(gè)SQL語(yǔ)句并顯示結(jié)果,可以用來(lái)校驗(yàn)下import的查詢條件是否正確钉凌。
eval Evaluate a SQL statement and display the results
#將HDFS目錄導(dǎo)出到數(shù)據(jù)庫(kù)表
export Export an HDFS directory to a database table
#可用命令列表
help List available commands
#將表從數(shù)據(jù)庫(kù)導(dǎo)入到HDFS
import Import a table from a database to HDFS
#將所有表從數(shù)據(jù)庫(kù)導(dǎo)入到HDFS
import-all-tables Import tables from a database to HDFS
#從大型機(jī)服務(wù)器導(dǎo)入數(shù)據(jù)集到HDFS
import-mainframe Import datasets from a mainframe server to HDFS
#將Import任務(wù)保存為job咧最,可以理解為起了個(gè)別名,這樣方便的Sqoop任務(wù)的管理御雕。
job Work with saved jobs
#列出服務(wù)器上可用的數(shù)據(jù)庫(kù)
list-databases List available databases on a server
#列出數(shù)據(jù)庫(kù)上可用的b表
list-tables List available tables in a database
#增量導(dǎo)入的合并結(jié)果
merge Merge results of incremental imports
#運(yùn)行一個(gè)獨(dú)立的Sqoop metastore
metastore Run a standalone Sqoop metastore
#顯示sqoop的版本
version Display version information
See 'sqoop help COMMAND' for information on a specific command.
五:Sqoop的基本使用
執(zhí)行Sqoop命令時(shí)矢沿,請(qǐng)登錄對(duì)hadoop有操作權(quán)限的系統(tǒng)用戶,否則會(huì)報(bào)沒有權(quán)限等錯(cuò)誤酸纲。
以下命令中出現(xiàn)的
\
為連接符捣鲸,連接下一句命令,在實(shí)際操作中也可使用闽坡。
列出Mysql中有哪些數(shù)據(jù)庫(kù)
sqoop list-databases \
-connect jdbc:mysql://localhost:3306/ \
-username root \
-password root
列出Mysql中指定數(shù)據(jù)庫(kù)的表
sqoop list-tables \
-connect jdbc:mysql://localhost:3306/sqoop_test \
-username root \
-password root
創(chuàng)建一張跟sqoop_test庫(kù)中user表結(jié)構(gòu)一樣的hive表hive_user
此處需要將 hive 中的
hive-common-2.3.6.jar
包復(fù)制到 sqoop 的 lib 文件夾下栽惶,否則會(huì)報(bào)java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
sqoop create-hive-table \
-connect jdbc:mysql://localhost:3306/sqoop_test \
-username root \
-password root \
-table user \
-hive-table hive_user #要?jiǎng)?chuàng)建的hive表名
創(chuàng)建完后可登錄hive查看,以下為所執(zhí)行的命令:
hive #登錄Hive
show databases; #查看數(shù)據(jù)庫(kù)
use default; #選擇數(shù)據(jù)庫(kù),由于上面沒有指定數(shù)據(jù)庫(kù)疾嗅,所以在默認(rèn)數(shù)據(jù)庫(kù)中創(chuàng)建了表
show tables; #列出Default數(shù)據(jù)庫(kù)中的所有表
Mysql→HDFS:從Mysql導(dǎo)入到HDFS
sqoop import \
-connect jdbc:mysql://{數(shù)據(jù)庫(kù)IP}:3306/{數(shù)據(jù)庫(kù)}?autoReconnect=true \ #數(shù)據(jù)庫(kù)連接
-driver com.mysql.jdbc.Driver \ #數(shù)據(jù)庫(kù)驅(qū)動(dòng)
-username root \ #數(shù)據(jù)庫(kù)用戶名
-password root \ #數(shù)據(jù)庫(kù)密碼
-table user \ #數(shù)據(jù)庫(kù)表
-target-dir /user/admin/temp/sqoop-import \ #導(dǎo)入到HDFS的目標(biāo)目錄
-fields-terminated-by ',' \ #按什么分隔
-m 1 #MapReduce執(zhí)行任務(wù)數(shù)
拓展命令(在導(dǎo)出中同樣適用):
-where "name = 'ZhangSan'" #帶Where條件導(dǎo)入
-columns "name" #導(dǎo)入指定列
#自定義Sql查詢外厂,導(dǎo)入查詢后數(shù)據(jù)
-query 'select * from mysql.help_keyword where $CONDITIONS and name = "STRING"'
-split-by ‘id’ #主鍵
-incremental append #增量導(dǎo)入
在需要按照自定義SQL語(yǔ)句導(dǎo)出數(shù)據(jù)到HDFS的情況下:
- 引號(hào)問(wèn)題,要么外層使用單引號(hào)代承,內(nèi)層使用雙引號(hào)汁蝶,
符號(hào)不用轉(zhuǎn)義, 要么外層使用雙引號(hào)论悴,那么內(nèi)層使用單引號(hào)掖棉,然后
符號(hào)需要轉(zhuǎn)義。
- 自定義的SQL語(yǔ)句中必須帶有WHERE $CONDITIONS
HDFS→Mysql:從HDFS中導(dǎo)出到Mysql
sqoop export \
-connect jdbc:mysql://{數(shù)據(jù)庫(kù)IP}:3306/{數(shù)據(jù)庫(kù)}?autoReconnect=true \ #數(shù)據(jù)庫(kù)連接
-driver com.mysql.jdbc.Driver \ #數(shù)據(jù)庫(kù)驅(qū)動(dòng)
-username root \ #數(shù)據(jù)庫(kù)用戶名
-password root \ #數(shù)據(jù)庫(kù)密碼
-table sqoop_test \ #數(shù)據(jù)庫(kù)表
-export-dir /user/admin/temp/sqoop-import \ #導(dǎo)出HDFS的目標(biāo)目錄到Mysql
-fields-terminated-by ',' \ #按什么分隔
-split-by id \ #主鍵
-m 1 #MapReduce執(zhí)行任務(wù)數(shù)
記錄問(wèn)題:
- 數(shù)據(jù)庫(kù)連接處**必須帶上 **
autoReconnect=true
屬性膀估;- 若數(shù)據(jù)庫(kù)連接帶上了
serverTimezone=UTC
屬性幔亥,則會(huì)導(dǎo)致后面語(yǔ)法報(bào)未找到命令錯(cuò)誤;
- 如果Mysql為8.0的版本玖像,同樣不需要帶上這個(gè)屬性;
- 導(dǎo)入導(dǎo)出時(shí)需帶上
-driver
命令,否則有可能會(huì)導(dǎo)致出現(xiàn)數(shù)據(jù)庫(kù)連接失敗錯(cuò)誤捐寥;
- 如果Mysql為8.0的版本笤昨,需要更改為8.0驅(qū)動(dòng)包:
com.mysql.cj.jdbc.Driver
- 執(zhí)行命令時(shí)必須帶上
-split-by
或者-m 1
命令,否則會(huì)報(bào)錯(cuò)握恳;-fields-terminated-by
命令表示 數(shù)據(jù)庫(kù)中的列在導(dǎo)入文本中按照什么字符分隔瞒窒,如上面例子中的 ,;
Mysql→Hive:從Mysql導(dǎo)入到Hive中
導(dǎo)入過(guò)程:先導(dǎo)入到 hdfs乡洼,然后再 load 進(jìn)入 hive
普通導(dǎo)入:數(shù)據(jù)存儲(chǔ)在Hive默認(rèn)的default庫(kù)中崇裁,表名就是對(duì)應(yīng)的mysql的表名:
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop_test \ #數(shù)據(jù)庫(kù)連接
--username root \ #數(shù)據(jù)庫(kù)用戶名
--password root \ #數(shù)據(jù)庫(kù)密碼
--table user \ #數(shù)據(jù)庫(kù)表
--hive-import \ #導(dǎo)入路徑
-m 1 #任務(wù)并發(fā)數(shù)
查看 Hive 中的數(shù)據(jù)
hadoop fs -cat /user/hive/warehouse/user/part-m-00000 #user就是表名
拓展命令:
-fields-terminated-by "," #數(shù)據(jù)按什么分隔
-lines-terminated-by "\n" #行數(shù)按什么分隔
-hive-overwrite #指定覆蓋導(dǎo)入
-create-hive-table #指定自動(dòng)創(chuàng)建hive表
-delete-target-dir #指定刪除中間結(jié)果數(shù)據(jù)目錄
-hive-database mydb_test #指定Hive數(shù)據(jù)庫(kù)
-hive-table new_user #指定表名
-incremental append #增量導(dǎo)入
當(dāng)指定Hive數(shù)據(jù)庫(kù)時(shí)束昵,必須先創(chuàng)建該數(shù)據(jù)庫(kù)拔稳,否則會(huì)報(bào)
Database does not exist: xx
數(shù)據(jù)庫(kù)不存在。從Hive導(dǎo)出到Mysql的步驟 和 從HDFS導(dǎo)出到Mysql的步驟 一致锹雏。