數據集成工具—Sqoop
數據集成/採集/同步工具
@
Sqoop簡介
sqoop將關係型資料庫(mysql、oracle等)數據與hadoop數據進行轉換的工具。
sqoop1.4.x與sqoop1.99.x完全不兼容
Sqoop安裝
安裝包資源主頁自取
1、上傳並解壓
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/soft/
2、修改文件夾名字
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7
3、修改配置文件
# 切換到sqoop配置文件目錄
cd /usr/local/soft/sqoop-1.4.7/conf
# 複製配置文件並重命名
cp sqoop-env-template.sh sqoop-env.sh
# vim sqoop-env.sh 編輯配置文件,並加入以下內容
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-2.7.6
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop-2.7.6/share/hadoop/mapreduce
export HBASE_HOME=/usr/local/soft/hbase-1.4.6
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.4.6/conf
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
# 切換到bin目錄
cd /usr/local/soft/sqoop-1.4.7/bin
# vim configure-sqoop 修改配置文件,注釋掉沒用的內容(就是為了去掉警告資訊)
4、修改環境變數
vim /etc/profile
# 將sqoop的目錄加入環境變數
export SQOOP_HOME=/usr/local/soft/sqoop-1.4.7
5、添加MySQL連接驅動
# 從HIVE中複製MySQL連接驅動到$SQOOP_HOME/lib
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/sqoop-1.4.7/lib/
6、測試
# 列印sqoop版本
sqoop version
# 測試MySQL連通性
sqoop list-databases -connect jdbc:mysql://master:3306?useSSL=false -username root -password 123456
準備MySQL數據
登錄MySQL資料庫
mysql -u root -p123456;
創建student資料庫
create database student;
切換資料庫並導入數據
# mysql shell中執行
use student;
source /root/student.sql;
source /root/score.sql;
另外一種導入數據的方式
# linux shell中執行
mysql -u root -p123456 student</root/student.sql
mysql -u root -p123456 student</root/score.sql
使用Navicat運行SQL文件
也可以通過Navicat導入
導出MySQL資料庫
mysqldump -u root -p123456 資料庫名>/路徑/任意一個文件名.sql
import
從傳統的關係型資料庫導入HDFS、HIVE、HBASE……
MySQLToHDFS
編寫腳本,保存為MySQLToHDFS.conf
將下面內容寫進腳本
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--m
2
--split-by
age
--target-dir
/sqoop/data/student1
--fields-terminated-by
','
屬性解析
–m mapr任務
2 兩個
–split-by 按照age切分
age
–target-dir hdfs路徑
/sqoop/data/student1
–fields-terminated-by ‘,’ 列之間的分隔符為,
運行方式一: 執行腳本
sqoop --options-file MySQLToHDFS.conf
運行方式二:直接在shell運行
sqoop import \
--connect \
jdbc:mysql://master:3306/student?useSSL=false \
--username \
root \
--password \
123456 \
--table \
student \
--m \
2 \
--split-by \
age \
--target-dir \
/sqoop/data/student1 \
--fields-terminated-by \
','
注意事項:
1、–m 表示指定生成多少個Map任務,不是越多越好,因為MySQL Server的承載能力有限。
2、當指定的Map任務數>1,那麼需要結合--split-by
參數,指定分割鍵,以確定每個map任務到底讀取哪一部分數據,最好指定數值型的列,最好指定主鍵(或者分布均勻的列=>避免每個map任務處理的數據量差別過大),如果mysql建表時,設置了主鍵,並且是數值型,就會默認是按照主鍵切分,如果沒有設置主鍵,報錯。
3、如果指定的分割鍵數據分布不均,可能導致map端「數據傾斜」問題。
4、分割的鍵最好指定數值型的,而且欄位的類型為int、bigint這樣的數值型
5、編寫腳本的時候,注意:例如:--username
參數,參數值不能和參數名同一行
--username root // 錯誤的
// 應該分成兩行
--username
root
6、運行的時候會報錯InterruptedException,hadoop2.7.6自帶的問題,忽略即可
21/01/25 14:32:32 WARN hdfs.DFSClient: Caught exception
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1252)
at java.lang.Thread.join(Thread.java:1326)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.closeResponder(DFSOutputStream.java:716)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.endBlock(DFSOutputStream.java:476)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:652)
7、實際上sqoop在讀取mysql數據的時候,用的是JDBC的方式,所以當數據量大的時候,效率不是很高。
8、sqoop底層通過MapReduce完成數據導入導出,只需要Map任務,不需要Reduce任務
9、每個Map任務會生成一個文件。
MySQLToHive
Sqoop 導入數據到 Hive 是通過先將數據導入到 HDFS 上的臨時目錄,然後再將數據從 HDFS 上 Load 到 Hive 中,最後將臨時目錄刪除。可以使用 target-dir 來指定臨時目錄。
在Hive中創建testsqoop庫
hive> create database testsqoop;
編寫腳本,並保存為MySQLToHIVE.conf文件
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
score
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--m
3
--split-by
student_id
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
testsqoop
--hive-table
score
--delete-target-dir
直接運行報錯
將HADOOP_CLASSPATH加入環境變數中
vim /etc/profile
# 加入如下內容
export HADOOP_CLASSPATH=$HADOOP_HOME/lib:$HIVE_HOME/lib/*
# 重新載入環境變數
source /etc/profile
將hive-site.xml放入SQOOP_HOME/conf/
cp /usr/local/soft/hive-1.2.1/conf/hive-site.xml /usr/local/soft/sqoop-1.4.7/conf/
執行腳本
sqoop --options-file MySQLToHIVE.conf
–direct
加上這個參數,可以在導出MySQL數據的時候,使用MySQL提供的導出工具mysqldump,加快導出速度,提高效率
直接加上–direct,運行後報錯
需要將master上的/usr/bin/mysqldump分發至 node1、node2的/usr/bin目錄下
mapreduce任務在nodeManager上面執行的
scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/
-e參數的使用
-e 可以在後面加上sql語句
“select * from score where student_id=1500100011 and $CONDITIONS”
import
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--m
2
--split-by
student_id
--e
"select * from score where student_id=1500100011 and $CONDITIONS"
--target-dir
/testQ
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
testsqoop
--hive-table
score2
MySQLToHBase
編寫腳本,並保存為MySQLToHBase.conf
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--hbase-table
student
--hbase-create-table
--hbase-row-key
id
--m
1
--column-family
cf1
在HBase中創建student表
create 'student','cf1'
執行腳本
sqoop --options-file MySQLToHBase.conf
export
HDFSToMySQL
編寫腳本,並保存為HDFSToMySQL.conf
export
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
-m
1
--columns
id,name,age,gender,clazz
--export-dir
/sqoop/data/student1/
--fields-terminated-by
','
先清空MySQL student表中的數據,不然會造成主鍵衝突
執行腳本
sqoop --options-file HDFSToMySQL.conf
查看sqoop help
sqoop help
21/04/26 15:50:36 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.
# 查看import的詳細幫助
sqoop import --help
sqoop官網: