大資料學習筆記(十四)-Sqoop

狂暴棕熊發表於2017-12-25

1.版本
sqoop1為1.4.6以前的版本(包括)
sqoop2為1.4.6以後的版本(不包括)
sqoop1與sqoop2的構架是不同的
2.sqoop配置
conf/sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0

#set the path to where bin/hbase is available
#export HBASE_HOME=

#Set the path to where bin/hive is available
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0

3.把MySQL驅動拷貝到lib資料夾下

[hadoop@hadoop000 lib]$ cp ~/software/mysql-connector-java-5.1.27-bin.jar ./

4.操作sqoop
①檢視MySQL中的資料庫

[hadoop@hadoop000 bin]$ ./sqoop list-databases \
> --connect jdbc:mysql://localhost:3306 \
> --username root \
> --password root

②檢視MySQL中的表

./sqoop list-tables \
--connect jdbc:mysql://localhost:3306/hive \
--username root \
--password root

③使用sqoop將MySQL中的資料匯入Hadoop中

sqoop import匯入時報java.lang.ClassNotFoundException: org.json.JSONObject
錯誤 解決方法,將java-json.jar放到sqoop的lib目錄下
下載java-json.jar包:
http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1

檔案會儲存在hdfs上/user/使用者名稱/表名下

17/12/25 17:13:11 ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://hadoop000:8020/user/hadoop/EMP already exists

檔案已存在異常的解決方法

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1 \
--delete-target-dir

設定Job名稱

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1 \
--delete-target-dir \
--mapreduce-job-name FromMySQLToHDFS 

map的數量設定,一個表的資料不要超過3到5分鐘

指定匯入的column和輸出的目錄

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1 \
--delete-target-dir \
--mapreduce-job-name FromMySQLToHDFS \
--columns "EMPNO,ENAME,JOB" \
--target-dir EMP_COLUMN

以parquet格式輸出

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1 \
--delete-target-dir \
--mapreduce-job-name FromMySQLToHDFS \
--columns "EMPNO,ENAME,JOB" \
--as-parquetfile \
--target-dir EMP_COLUMN

條件匯入方式一,where條件子句過濾

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP -m 1 \
--delete-target-dir \
--mapreduce-job-name FromMySQLToHDFS \
--columns "EMPNO,ENAME,JOB,SAL" \
--where "SAL > 2000" \
--target-dir EMP_COLUMN

條件匯入方式二,使用–query或–e匯入SQL的執行結果

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
-m 2 \
--delete-target-dir \
--mapreduce-job-name FromMySQLToHDFS \
--query 'SELECT * FROM EMP where SAL > 2000 AND $CONDITIONS' \
--target-dir EMP_COLUMN \
--split-by 'EMPNO'

使用option file實現資料匯入

emp.opt

import
--connect 
jdbc:mysql://localhost:3306/project
--username
root
--password
root
-m
2
--delete-target-dir
--mapreduce-job-name
FromMySQLToHDFS
--query
'SELECT * FROM EMP where SAL > 2000 AND $CONDITIONS'
--target-dir
EMP_OPT
--split-by 
'EMPNO'

執行命令

sqoop --options-file emp.opt

④從hdfs匯入到關係型資料庫(MySQL)當中
MySQL資料庫中要先建表

sqoop export \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP_DEMO \
--export-dir /user/hadoop/EMP_OPT \
-m -1

匯入指定的列

sqoop export \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
--table EMP_DEMO -m 1 \
--mapreduce-job-name FromHDFSToMySQL \
--columns "EMPNO,ENAME,JOB,SAL" \
--export-dir /user/hadoop/EMP_COLUMN

資料的匯入匯出可以指定自定義的分隔符,分隔符指定錯誤會導致匯入匯出作業失敗。
⑤從關係型資料庫(MySQL)匯入資料到Hive中

自動建表(此方式不推薦,因為有可能資料型別不正確)

sqoop import \
--connect jdbc:mysql://localhost:3306/project \
--username root \
--password root \
-m 1 \
--table EMP \
--delete-target-dir \
--hive-import \
--create-hive-table \
--hive-table emp_import

報錯解決方法:
將hive/lib下的hive-shims*.jar 拷貝到sqoop/lib資料夾下
將hive/lib下的hive-common.jar拷貝到sqoop/lib資料夾下

⑥使用shell封裝ETL

相關文章