目錄 正文 一、概述
sqoop 是 apache 旗下一款“Hadoop 和關(guān)系數(shù)據(jù)庫服務(wù)器之間傳送數(shù)據(jù)”的工具。
核心的功能有兩個:
導(dǎo)入、遷入
導(dǎo)出、遷出
導(dǎo)入數(shù)據(jù):MySQL,Oracle 導(dǎo)入數(shù)據(jù)到 Hadoop 的 HDFS、HIVE、HBASE 等數(shù)據(jù)存儲系統(tǒng)
導(dǎo)出數(shù)據(jù):從 Hadoop 的文件系統(tǒng)中導(dǎo)出數(shù)據(jù)到關(guān)系數(shù)據(jù)庫 mysql 等 Sqoop 的本質(zhì)還是一個命令行工具,和 HDFS,Hive 相比,并沒有什么高深的理論。
sqoop:
工具:本質(zhì)就是遷移數(shù)據(jù), 遷移的方式:就是把sqoop的遷移命令轉(zhuǎn)換成MR程序
hive
工具,本質(zhì)就是執(zhí)行計算,依賴于HDFS存儲數(shù)據(jù),把SQL轉(zhuǎn)換成MR程序
二、工作機制
將導(dǎo)入或?qū)С雒罘g成 MapReduce 程序來實現(xiàn) 在翻譯出的 MapReduce 中主要是對 InputFormat 和 OutputFormat 進行定制
三、安裝
1、前提概述
將來sqoop在使用的時候有可能會跟那些系統(tǒng)或者組件打交道?
HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL
sqoop就是一個工具, 只需要在一個節(jié)點上進行安裝即可。
補充一點: 如果你的sqoop工具將來要進行hive或者hbase等等的系統(tǒng)和MySQL之間的交互
你安裝的SQOOP軟件的節(jié)點一定要包含以上你要使用的集群或者軟件系統(tǒng)的安裝包
補充一點: 將來要使用的azakban這個軟件 除了會調(diào)度 hadoop的任務(wù)或者hbase或者hive的任務(wù)之外, 還會調(diào)度sqoop的任務(wù)
azkaban這個軟件的安裝節(jié)點也必須包含以上這些軟件系統(tǒng)的客戶端/2、
2、軟件下載
下載地址http://mirrors./apache/
sqoop版本說明
絕大部分企業(yè)所使用的sqoop的版本都是 sqoop1
sqoop-1.4.6 或者 sqoop-1.4.7 它是 sqoop1
sqoop-1.99.4----都是 sqoop2
此處使用sqoop-1.4.6版本sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
3、安裝步驟
(1)上傳解壓縮安裝包到指定目錄
因為之前hive只是安裝在hadoop3機器上,所以sqoop也同樣安裝在hadoop3機器上
[hadoop@hadoop3 ~]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C apps/
(2)進入到 conf 文件夾,找到 sqoop-env-template.sh,修改其名稱為 sqoop-env.sh cd conf
[hadoop@hadoop3 ~]$ cd apps/
[hadoop@hadoop3 apps]$ ls
apache-hive-2.3.3-bin hadoop-2.7.5 hbase-1.2.6 sqoop-1.4.6.bin__hadoop-2.0.4-alpha zookeeper-3.4.10
[hadoop@hadoop3 apps]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop-1.4.6
[hadoop@hadoop3 apps]$ cd sqoop-1.4.6/conf/
[hadoop@hadoop3 conf]$ ls
oraoop-site-template.xml sqoop-env-template.sh sqoop-site.xml
sqoop-env-template.cmd sqoop-site-template.xml
[hadoop@hadoop3 conf]$ mv sqoop-env-template.sh sqoop-env.sh
(3)修改 sqoop-env.sh
[hadoop@hadoop3 conf]$ vi sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.5
#set the path to where bin/hbase is available
export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.3-bin
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
為什么在sqoop-env.sh 文件中會要求分別進行 common和mapreduce的配置呢???
在apache的hadoop的安裝中;四大組件都是安裝在同一個hadoop_home中的
但是在CDH, HDP中, 這些組件都是可選的。
在安裝hadoop的時候,可以選擇性的只安裝HDFS或者YARN,
CDH,HDP在安裝hadoop的時候,會把HDFS和MapReduce有可能分別安裝在不同的地方。
(4)加入 mysql 驅(qū)動包到 sqoop1.4.6/lib 目錄下
[hadoop@hadoop3 ~]$ cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/
(5)配置系統(tǒng)環(huán)境變量
[hadoop@hadoop3 ~]$ vi .bashrc
#Sqoop
export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
保存退出使其立即生效
[hadoop@hadoop3 ~]$ source .bashrc
(6)驗證安裝是否成功
sqoop-version 或者 sqoop version
四、Sqoop的基本命令
基本操作
首先,我們可以使用 sqoop help 來查看,sqoop 支持哪些命令
[hadoop@hadoop3 ~]$ sqoop help
Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/12 13:37:19 INFO sqoop.Sqoop: Running Sqoop version: 1.4.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 information
See 'sqoop help COMMAND' for information on a specific command.
[hadoop@hadoop3 ~]$
然后得到這些支持了的命令之后,如果不知道使用方式,可以使用 sqoop command 的方式 來查看某條具體命令的使用方式,比如:
View Code
示例
列出MySQL數(shù)據(jù)有哪些數(shù)據(jù)庫
[hadoop@hadoop3 ~]$ sqoop list-databases \
> --connect jdbc:mysql://hadoop1:3306/ \
> --username root \
> --password root
Warning: /home/hadoop/apps/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/apps/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
18/04/12 13:43:51 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
18/04/12 13:43:51 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/04/12 13:43:51 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hivedb
mysql
performance_schema
test
[hadoop@hadoop3 ~]$
列出MySQL中的某個數(shù)據(jù)庫有哪些數(shù)據(jù)表:
[hadoop@hadoop3 ~]$ sqoop list-tables \ > --connect jdbc:mysql://hadoop1:3306/mysql \ > --username root \ > --password root
View Code
創(chuàng)建一張跟mysql中的help_keyword表一樣的hive表hk:
sqoop create-hive-table --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --hive-table hk
View Code
五、Sqoop的數(shù)據(jù)導(dǎo)入
“導(dǎo)入工具”導(dǎo)入單個表從 RDBMS 到 HDFS。表中的每一行被視為 HDFS 的記錄。所有記錄 都存儲為文本文件的文本數(shù)據(jù)(或者 Avro、sequence 文件等二進制數(shù)據(jù))
1、從RDBMS導(dǎo)入到HDFS中
語法格式
sqoop import (generic-args) (import-args)
常用參數(shù)
--connect <jdbc-uri> jdbc 連接地址
--connection-manager <class-name> 連接管理者
--driver <class-name> 驅(qū)動類
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help 信息
-P 從命令行輸入密碼
--password <password> 密碼
--username <username> 賬號
--verbose 打印流程信息
--connection-param-file <filename> 可選參數(shù)
示例
普通導(dǎo)入:導(dǎo)入mysql庫中的help_keyword的數(shù)據(jù)到HDFS上
導(dǎo)入的默認路徑:/user/hadoop/help_keyword
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword -m 1
View Code
查看導(dǎo)入的文件
[hadoop@hadoop4 ~]$ hadoop fs -cat /user/hadoop/help_keyword/part-m-00000
導(dǎo)入: 指定分隔符和導(dǎo)入路徑
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --table help_keyword --target-dir /user/hadoop11/my_help_keyword1 --fields-terminated-by '\t' -m 2
導(dǎo)入數(shù)據(jù):帶where條件
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --where "name='STRING' " --table help_keyword --target-dir /sqoop/hadoop11/myoutport1 -m 1
查詢指定列
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql --username root --password root --columns "name" --where "name='STRING' " --table help_keyword --target-dir /sqoop/hadoop11/myoutport22 -m 1
selct name from help_keyword where name = "string"
導(dǎo)入:指定自定義查詢SQL
sqoop import --connect jdbc:mysql://hadoop1:3306/ --username root --password root --target-dir /user/hadoop/myimport33_1 --query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' --split-by help_keyword_id --fields-terminated-by '\t' -m 4
在以上需要按照自定義SQL語句導(dǎo)出數(shù)據(jù)到HDFS的情況下: 1、引號問題,要么外層使用單引號,內(nèi)層使用雙引號,$CONDITIONS的$符號不用轉(zhuǎn)義, 要么外層使用雙引號,那么內(nèi)層使用單引號,然后$CONDITIONS的$符號需要轉(zhuǎn)義 2、自定義的SQL語句中必須帶有WHERE \$CONDITIONS
2、把MySQL數(shù)據(jù)庫中的表數(shù)據(jù)導(dǎo)入到Hive中
Sqoop 導(dǎo)入關(guān)系型數(shù)據(jù)到 hive 的過程是先導(dǎo)入到 hdfs,然后再 load 進入 hive
普通導(dǎo)入:數(shù)據(jù)存儲在默認的default hive庫中,表名就是對應(yīng)的mysql的表名:
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-import \
-m 1
導(dǎo)入過程
第一步:導(dǎo)入mysql.help_keyword的數(shù)據(jù)到hdfs的默認路徑 第二步:自動仿造mysql.help_keyword去創(chuàng)建一張hive表, 創(chuàng)建在默認的default庫中 第三步:把臨時目錄中的數(shù)據(jù)導(dǎo)入到hive表中
查看數(shù)據(jù)
[hadoop@hadoop3 ~]$ hadoop fs -cat /user/hive/warehouse/help_keyword/part-m-00000
指定行分隔符和列分隔符,指定hive-import,指定覆蓋導(dǎo)入,指定自動創(chuàng)建hive表,指定表名,指定刪除中間結(jié)果數(shù)據(jù)目錄
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database mydb_test \
--hive-table new_help_keyword
報錯原因是hive-import 當(dāng)前這個導(dǎo)入命令。 sqoop會自動給創(chuàng)建hive的表。 但是不會自動創(chuàng)建不存在的庫
手動創(chuàng)建mydb_test數(shù)據(jù)塊
hive> create database mydb_test;
OK
Time taken: 6.147 seconds
hive>
之后再執(zhí)行上面的語句沒有報錯
查詢一下
select * from new_help_keyword limit 10;
上面的導(dǎo)入語句等價于
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--hive-table mydb_test.new_help_keyword \
--delete-target-dir
增量導(dǎo)入
執(zhí)行增量導(dǎo)入之前,先清空hive數(shù)據(jù)庫中的help_keyword表中的數(shù)據(jù)
truncate table help_keyword;
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport_add \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \
-m 1
語句執(zhí)行成功
View Code
查看結(jié)果
3、把MySQL數(shù)據(jù)庫中的表數(shù)據(jù)導(dǎo)入到hbase
普通導(dǎo)入
sqoop import --connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id
此時會報錯,因為需要先創(chuàng)建Hbase里面的表,再執(zhí)行導(dǎo)入的語句
hbase(main):001:0> create 'new_help_keyword', 'base_info'
0 row(s) in 3.6280 seconds
=> Hbase::Table - new_help_keyword
hbase(main):002:0>
|