Linux環境Sqoop安裝配置及使用
1. 認識Sqoop
(1) Sqoop介紹
- 資料遷移工具(等價於mapreduce的map階段)
- 過程:資料匯入-->處理-->資料匯出
- 作用:簡化開發
- 官網:http://sqoop.apache.org/
- 概述:Apache Sqoop是一種工具,用於在Apache Hadoop和結構化資料儲存(如關聯式資料庫)之間高效傳輸批量資料——資料遷移。
2. sqoop-1.4.7安裝配置流程
(1) Sqoop環境前提:
- Hadoop
- 關係型資料庫(MySQL/Oracle)
- HBase
- Hive
- ZooKeeper
(2) 解壓sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz安裝包到目標目錄下:
tar -zxvf .tar.gz -C 目標目錄
(3) 為後續方便,重新命名Sqoop資料夾:
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7
(4) 修改配置檔案:
- 進入sqoop-1.4.7/conf路徑,重新命名配置檔案:
mv sqoop-env-template.sh sqoop-env.sh
- 修改sqoop-env.sh資訊:(若配置了環境變數,可通過
echo $XXXXX_HOME
查詢安裝位置)vi sqoop-env.sh
-
#Set path to where bin/hadoop is available export HADOOP_COMMON_HOME=Hadoop安裝路徑 #Set path to where hadoop-*-core.jar is available #export HADOOP_MAPRED_HOME=Hadoop安裝路徑 #set the path to where bin/hbase is available #export HBASE_HOME=HBase安裝路徑 #Set the path to where bin/hive is available #export HIVE_HOME=Hive安裝路徑 #Set the path for where zookeper config dir is #export ZOOCFGDIR=ZooKeeper 配置資料夾 路徑 複製程式碼
(5) 關聯Hive:
cp /XXX/hive/conf/hive-site.xml /XXX/sqoop-1.4.7/conf/
(5) 配置環境變數:
- 修改配置檔案:
vi /etc/profile
- 增加以下內容:
export SQOOP_HOME=sqoop安裝路徑
export PATH=$PATH:$SQOOP_HOME/bin
- 宣告環境變數:
source /etc/profile
(6) 啟動檢視版本號
sqoop version
(7) 新增驅動:
- 匯入MySQL驅動到sqoop/lib下
- 匯入Oracle驅動到sqoop/lib下
3. Sqoop操作
(1) 常用引數:
- 引數檢視:Sqoop官網 -> documentation -> Sqoop User Guide
import
匯入資料到叢集export
從叢集匯出資料create-hive-table
建立hive表import-all-tables
指定關係型資料庫所有表到叢集list-databases
列出所有資料庫list-tables
列出所有資料庫表merge
合併資料codegen
獲取某張表資料生成JavaBean並打Jar包
(2) import——Sqoop的匯入操作:
- 功能:MySQL/Oracle --> HDFS/Hive
- 修改MySQL訪問許可權:
- 檢視許可權:
use mysql;
select User, Host, Password from user;
- 修改許可權為所有使用者都可訪問:
update user set host='%' where host='localhost';
delete from user where Host='127.0.0.1';
delete from user where Host='bigdata01';
delete from user where Host='::1';
flush privileges;
- 檢視許可權:
- 操作命令:
- 本地mysql表上傳至hdfs:
- 匯出命令:
sqoop import
--connect jdbc:mysql://bigdata01:3306/資料庫名
# 連線MySQL--username root
# 使用者名稱--password XXXXXX
# 密碼--table 表名
# 上傳至HDFS的表--target-dir /YYYYYYY
# HDFS目標資料夾--num-mappers 1
# 指定map執行--fields-terminated-by "\t"
# 指定分隔符
- Linux本地檢視hdfs上傳結果:
hdfs dfs -cat /XXXXXXX/part-m-00000
- 使用query對資料進行過濾:
sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password XXXXXX --table 表名 --target-dir /YYYYYYY --num-mappers 1 --fields-terminated-by "\t" --query 'select * from 表名 where 條件 and $CONDITIONS'
# $CONDITIONS 對mapper進行索引
- 直接過濾欄位:
sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password XXXXXX --table 表名 --target-dir /YYYYYYY --num-mappers 1 --columns 欄位名
- 匯出命令:
- 本地mysql表上傳至hive:
- 準備工作:
- 開啟hive服務
- 在hive中建立好要匯入的對應表
- 匯入命令:
sqoop import --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password 密碼 --table 表名 --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table hive資料庫名.表名
- 在Hive中可以看到指定表中已傳入資料資訊
- 可能報錯1:
ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
- 報錯原因:hive環境變數配置缺失
- 解決方法:——Hadoop環境加入Hive依賴
- 修改配置檔案:
vi /etc/profile
- 增加以下內容:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
- 宣告環境變數:
source /etc/profile
- 修改配置檔案:
- 可能報錯2:
ERROR tool.ImportTool: Import failed: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://bigdata01:9000/XXXXXXXXXX already exists
- 報錯原因:hdfs中存在同名路徑
- 解決方法:
- 指定新路徑或者刪除hdfs中原檔案
- 可能報錯3:
FAILED: SemanticException [Error 10072]: Database does not exist: XXXXXXXX
- 報錯原因:Sqoop沒有關聯Hive
- 解決方法:
cp /XXX/hive/conf/hive-site.xml /XXX/sqoop-1.4.7/conf/
- 準備工作:
- 本地mysql表上傳至hdfs:
(3) emport——Sqoop的匯出操作:
- 功能:HDFS/Hive --> MySQL/Oracle
- 操作命令:
- hive表匯出至本地mysql:
- 匯出命令:
sqoop emport
--connect jdbc:mysql://bigdata01:3306/資料庫名
# 連線MySQL--username root
# 使用者名稱--password XXXXXX
# 密碼--table 表名
# 目標mysql表--export-dir /user/hive/warehouse/YYYYYYY
# hive資料夾--num-mappers 1
# 指定map執行--input-fields-terminated-by "\t"
# 指定分隔符
- 匯出命令:
- hive表匯出至本地mysql:
(4) 列出所有資料庫:
- 操作命令:
sqoop list-databases --connect jdbc:mysql://bigdata01:3306/ --username root --password 密碼
(5) 獲取資料庫表資料生成JavaBean:
- 操作命令:
sqoop codegen --connect jdbc:mysql://bigdata01:3306/資料庫名 --username root --password 密碼 --table 表名
-- bindir Linux本地路徑
# 指定Jar包打包路徑--class-name 類名
# 指定Java類名--fields-terminated-by "\t"
(6) 合併hdfs中不同目錄下的資料:
- 操作命令:
sqoop merge
--new-data hdfs新表路徑 --onto hdfs舊錶路徑
--target-dir /YYYYYYY
# 合併後的hdfs路徑--jar-file =
# Linux本地Jar包路徑--class-name XXXXX
# Jar包的類--merge-key id
# 合併依據
- **注意:**merge操作是一個新表替代舊錶的操作,如果有衝突id的話新表資料替換舊錶資料,如果沒有衝突則是新表資料新增到舊錶的資料。