sqoop部署及匯入與匯出
1.sqoop安裝
CDH之sqoop下載地址:
一.下載及環境配置
wget /sqoop-1.4.6-cdh5.7.0.tar.gz
tar -zxvf /sqoop-1.4.6-cdh5.7.0.tar.gz -C ~/app
[hadoop@hadoop001 conf]$ vim ~/.bash_profile
[hadoop@hadoop001 conf]$ source ~/.bash_profile
二.sqoop引數配置
[hadoop@hadoop001 bin]$ cp sqoop-env-template.sh sqoop-env.sh
[hadoop@hadoop001 bin]$ vim sqoop-env.sh
複製mysql驅動到$SQOOP_HOME/lib
三.啟動並驗證
四.檢視命令幫助
[hadoop@hadoop001 bin]$ sqoop help
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
2.sqoop匯出
一.HDFS匯入到MySQL
1) 檢視HDFS檔案資料
2) MySQL資料庫建立emp表
3) HDFS匯入MySQL資料庫emp表
引數解析:
#資料庫連線路徑
--connect jdbc:mysql://localhost:3306/test
#使用者名稱
--username root
#密碼
--password root
#MapTask作業名
--mapreduce-job-name FromHDFSToMySQL1
#匯入表名
--table emp
#MapTask的併發數(預設4)
-m 3
#hdfs檔案路徑
--export-dir /user/hive/warehouse/hive_data2.db/emp/emp*
#列分割(不指定hive預設\001分割,根據實際情況設定)
--fields-terminated-by '\t'
# 檢視emp表:
遇到錯誤:
4) HDFS匯入MySQL資料庫emp表(指定欄位匯入和條件)
#指定匯入欄位
--columns 'EMPNO,ENAME,JOB'
#string型別的NUll和非string型別的null轉換
--null-string '' --null-non-string '0'
3.sqoop匯入
一.MySQL匯入到HDFS
#查詢當前的資料庫
#查詢資料庫下的所有的表
#MySQL匯入到hdfs
#import條件匯入
分析:
提示錯誤:
解決方法:
1.資料庫emp_2表新增主鍵
2.新增 --split-by 引數;指定切分欄位 --split-by empno
3.指定-m 為 1
原理:
二.MySQL匯入到Hive
提示錯誤:
解決方法:
cp hive-common-1.1.0-cdh5.7.0.jar $SQOOP_HOME/lib
cp hive-shims* $SQOOP_HOME/lib
CDH之sqoop下載地址:
一.下載及環境配置
wget /sqoop-1.4.6-cdh5.7.0.tar.gz
tar -zxvf /sqoop-1.4.6-cdh5.7.0.tar.gz -C ~/app
[hadoop@hadoop001 conf]$ vim ~/.bash_profile
-
export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6
- export PATH=$SQOOP_HOME/bin:$PATH
二.sqoop引數配置
[hadoop@hadoop001 bin]$ cp sqoop-env-template.sh sqoop-env.sh
[hadoop@hadoop001 bin]$ vim sqoop-env.sh
- #配置hadoop 和 hive絕對徑
- #Set path to where bin/hadoop is available
- export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.8.1
- #Set path to where hadoop-*-core.jar is available
- export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.8.1
- #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
三.啟動並驗證
-
[hadoop@hadoop001 bin]$ sqoop
-
Warning: /home/hadoop/app/sqoop-1.4.6/../hbase does not HBase imports will fail.
-
Please set $HBASE_HOME to the root of your HBase installation.
-
Warning: /home/hadoop/app/sqoop-1.4.6/../hcatalog does not HCatalog jobs will fail.
-
Please set $HCAT_HOME to the root of your HCatalog installation.
-
Warning: /home/hadoop/app/sqoop-1.4.6/../accumulo does not Accumulo imports will fail.
-
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
-
Warning: /home/hadoop/app/sqoop-1.4.6/../zookeeper does not Accumulo imports will fail.
-
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
-
Try 'sqoop help' for usage.
- #Warning警告可以忽略...........................................
四.檢視命令幫助
[hadoop@hadoop001 bin]$ sqoop help
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
- [hadoop@hadoop001 bin]$ sqoop help export
-
[hadoop@hadoop001 bin]$ sqoop help import
2.sqoop匯出
一.HDFS匯入到MySQL
1) 檢視HDFS檔案資料
- [hadoop@hadoop001 ~]$ hadoop fs -cat /user/hive/warehouse/hive_data2.db/emp/emp*
-
7369 SMITH CLERK 7902 1980-12-17 800.00 20
-
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
-
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
-
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
-
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
-
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
-
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
-
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
-
7839 KING PRESIDENT 1981-11-17 5000.00 10
-
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
-
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
-
7900 JAMES CLERK 7698 1981-12-3 950.00 30
-
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
-
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
- 8888 HIVE PROGRAM 7839 1988-1-23 10300.00
-
create table emp
- (empno int,
-
ename varchar(255),
-
job varchar(255),
-
mgr int,
-
hiredate varchar(255),
-
salary double,
-
comm double,
- deptno int)
3) HDFS匯入MySQL資料庫emp表
-
sqoop export \
-
--connect jdbc:mysql://localhost:3306/test \
-
--username root --password root \
-
--mapreduce-job-name FromHDFSToMySQL1 \
-
--table emp \
-
-m 3 \
-
--export-dir /user/hive/warehouse/hive_data2.db/emp/emp* \
- --fields-terminated-by '\t'
引數解析:
#資料庫連線路徑
--connect jdbc:mysql://localhost:3306/test
#使用者名稱
--username root
#密碼
--password root
#MapTask作業名
--mapreduce-job-name FromHDFSToMySQL1
#匯入表名
--table emp
#MapTask的併發數(預設4)
-m 3
#hdfs檔案路徑
--export-dir /user/hive/warehouse/hive_data2.db/emp/emp*
#列分割(不指定hive預設\001分割,根據實際情況設定)
--fields-terminated-by '\t'
# 檢視emp表:
-
mysql> select * from emp;
-
+-------+--------+-----------+------+------------+--------+------+--------+
-
| empno | ename | job | mgr | hiredate | salary | comm | deptno |
-
+-------+--------+-----------+------+------------+--------+------+--------+
-
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 |
-
| 7499 | ALLEN | SALESMAN | 7698 | 1981-2-20 | 1600 | 300 | 30 |
-
| 7521 | WARD | SALESMAN | 7698 | 1981-2-22 | 1250 | 500 | 30 |
-
| 7566 | JONES | MANAGER | 7839 | 1981-4-2 | 2975 | NULL | 20 |
-
| 7654 | MARTIN | SALESMAN | 7698 | 1981-9-28 | 1250 | 1400 | 30 |
-
| 7698 | BLAKE | MANAGER | 7839 | 1981-5-1 | 2850 | NULL | 30 |
-
| 7782 | CLARK | MANAGER | 7839 | 1981-6-9 | 2450 | NULL | 10 |
-
| 7788 | SCOTT | ANALYST | 7566 | 1987-4-19 | 3000 | NULL | 20 |
-
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
-
| 7844 | TURNER | SALESMAN | 7698 | 1981-9-8 | 1500 | 0 | 30 |
-
| 7876 | ADAMS | CLERK | 7788 | 1987-5-23 | 1100 | NULL | 20 |
-
| 7900 | JAMES | CLERK | 7698 | 1981-12-3 | 950 | NULL | 30 |
-
| 7902 | FORD | ANALYST | 7566 | 1981-12-3 | 3000 | NULL | 20 |
-
| 7934 | MILLER | CLERK | 7782 | 1982-1-23 | 1300 | NULL | 10 |
-
| 8888 | HIVE | PROGRAM | 7839 | 1988-1-23 | 10300 | NULL | NULL |
-
+-------+--------+-----------+------+------------+--------+------+--------+
- 15 rows in set (0.00 sec)
遇到錯誤:
- Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
-
解決辦法:
-
複製java-json.jar新增到$sqoop_home/lib目錄下
-
-
java-json.jar下載地址:
- http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm
4) HDFS匯入MySQL資料庫emp表(指定欄位匯入和條件)
-
sqoop export \
-
--connect jdbc:mysql://localhost:3306/test \
-
--username root --password root \
-
--mapreduce-job-name FromHDFSToMySQL1 \
-
--table emp_2 \
-
-m 3 \
-
--export-dir /user/hive/warehouse/hive_data2.db/emp/emp* \
-
--columns 'EMPNO,ENAME,JOB' \
-
--fields-terminated-by '\t' \
- --null-string '' --null-non-string '0'
--columns 'EMPNO,ENAME,JOB'
#string型別的NUll和非string型別的null轉換
--null-string '' --null-non-string '0'
-
mysql> select * from emp_2;
-
+-------+--------+-----------+------+----------+--------+------+--------+
-
| empno | ename | job | mgr | hiredate | salary | comm | deptno |
-
+-------+--------+-----------+------+----------+--------+------+--------+
-
| 7876 | ADAMS | CLERK | NULL | NULL | NULL | NULL | NULL |
-
| 7900 | JAMES | CLERK | NULL | NULL | NULL | NULL | NULL |
-
| 7902 | FORD | ANALYST | NULL | NULL | NULL | NULL | NULL |
-
| 7934 | MILLER | CLERK | NULL | NULL | NULL | NULL | NULL |
-
| 8888 | HIVE | PROGRAM | NULL | NULL | NULL | NULL | NULL |
-
| 7369 | SMITH | CLERK | NULL | NULL | NULL | NULL | NULL |
-
| 7499 | ALLEN | SALESMAN | NULL | NULL | NULL | NULL | NULL |
-
| 7521 | WARD | SALESMAN | NULL | NULL | NULL | NULL | NULL |
-
| 7566 | JONES | MANAGER | NULL | NULL | NULL | NULL | NULL |
-
| 7654 | MARTIN | SALESMAN | NULL | NULL | NULL | NULL | NULL |
-
| 7698 | BLAKE | MANAGER | NULL | NULL | NULL | NULL | NULL |
-
| 7782 | CLARK | MANAGER | NULL | NULL | NULL | NULL | NULL |
-
| 7788 | SCOTT | ANALYST | NULL | NULL | NULL | NULL | NULL |
-
| 7839 | KING | PRESIDENT | NULL | NULL | NULL | NULL | NULL |
- | 7844 | TURNER | SALESMAN | NULL | NULL | NULL | NULL | NULL |
3.sqoop匯入
一.MySQL匯入到HDFS
#查詢當前的資料庫
-
sqoop list-databases \
-
--connect jdbc:mysql://localhost:3306 \
- --username root --password root
結果:
information_schema
hive_data
mysql
performance_schema
test
information_schema
hive_data
mysql
performance_schema
test
-
sqoop list-tables \
-
--connect jdbc:mysql://localhost:3306/test \
- --username root
- 結果:
-
emp
emp_2
- #import匯入
-
[hadoop@hadoop001 bin]$ sqoop import \
-
> --connect jdbc:mysql://localhost:3306/test \
-
> --username root --password root \
- > --table emp_2
-
- #檢視匯入檔案
-
[hadoop@hadoop001 sqoop-1.4.6]$ hadoop fs -cat emp_2/part*
7369,SMITH,CLERK,null,null,null,null,null
7499,ALLEN,SALESMAN,null,null,null,null,null
7521,WARD,SALESMAN,null,null,null,null,null
7566,JONES,MANAGER,null,null,null,null,null
- 分析:
-
--預設匯入hdfs路徑為/user/hadoop/表名/檔案
--預設mapreduce作業名為表名
--預設併發TapTask數-m為4個
--預設列的分割符為逗號
#import條件匯入
-
[hadoop@hadoop001 bin]$ sqoop import \
> --connect jdbc:mysql://localhost:3306/test \
> --username root --password root \
> --table emp -m 5 \
> --mapreduce-job-name FromMySQLToHDFS5 \
> --delete-target-dir \
> --columns "EMPNO,ENAME,JOB,SALARY,COMM" \
> --target-dir EMP_COLUMN_WHERE \
> --fields-terminated-by '\t' \
> --null-string '' --null-non-string '0' \
> --where 'SALARY>3000'
- #檢視匯入檔案
-
[hadoop@hadoop001 sqoop-1.4.6]$ hadoop fs -cat EMP_COLUMN_WHERE/part*
18/06/13 10:20:48 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
7839 KING PRESIDENT 5000.0 0
8888 HIVE PROGRAM 10300.0 0
分析:
-
-
--預設匯入hdfs路徑為/user/hadoop/表名/檔案 ; --target-dir 修改存放路徑表名命名
--預設mapreduce作業名為表名 --mapreduce-job-name 指定作業名
--預設併發TapTask數-m為4個 -m 修改MapTask併發數
--預設列的分割符為逗號 --fields-terminated-by 修改列的分隔符
--columns 指定匯入欄位
--null-string --null-non-string | string型別和非string型別的的null的型別轉換
--where | 引數的條件
#import查詢結果集匯入
[hadoop@hadoop001 bin]$ sqoop import \
> --connect jdbc:mysql://localhost:3306/test \
> --username root --password root \
> -m 2 \
> --mapreduce-job-name FromMySQLToHDFS \
> --delete-target-dir \
> --target-dir EMP_COLUMN_QUERY \
> --fields-terminated-by '\t' \
> --null-string '' --null-non-string '0' \
> --query "SELECT * FROM emp WHERE EMPNO>=7900 AND \$CONDITIONS" \
> --split-by 'EMPNO'
#檢視匯入檔案
[hadoop@hadoop001 ~]$ hadoop fs -text EMP_COLUMN_QUERY/part*
7900 JAMES CLERK 7698 1981-12-3 950.0 0 30
7902 FORD ANALYST 7566 1981-12-3 3000.0 0 20
7934 MILLER CLERK 7782 1982-1-23 1300.0 0 10
8888 HIVE PROGRAM 7839 1988-1-23 10300.0 0 0
分析:
--指定了--query不能指定--table表名,查詢條件可能是多表關聯
--query 單引號不需要轉義符,雙引號需要在$CONDITIONS前新增\轉義符
-
- Error during import: No primary key could be found for table emp_2. Please specify one with --split-by or perform a sequential import with '-m 1'.
1.資料庫emp_2表新增主鍵
2.新增 --split-by 引數;指定切分欄位 --split-by empno
3.指定-m 為 1
原理:
- Sqoop通可以過–split-by指定切分的欄位,–m設定mapper的數量。透過這兩個引數分解生成m個where子句,進行分段查詢。
- split-by 根據不同的引數型別有不同的切分方法,如表共有100條資料其中id為int型別,並且我們指定–split-by id,我們不設定map數量使用預設的為四個,首先Sqoop會取獲取切分欄位的MIN()和MAX()即(–split -by),再根據map數量進行劃分,這是欄位值就會分為四個map:(1-25)(26-50)(51-75)(75-100)。
- 根據MIN和MAX不同的型別採用不同的切分方式支援有Date,Text,Float,Integer, Boolean,NText,BigDecimal等等。
- 所以,若匯入的表中沒有主鍵,將-m 設定稱1或者設定split-by,即只有一個map執行,缺點是不能並行map錄入資料。(注意,當-m 設定的值大於1時,split-by必須設定欄位) 。
- split-by即便是int型,若不是連續有規律遞增的話,各個map分配的資料是不均衡的,可能會有些map很忙,有些map幾乎沒有資料處理的情況
二.MySQL匯入到Hive
-
- #import匯入Hive
-
--connect jdbc:mysql://localhost:3306/test \
-
--username root --password root \
-
--table emp -m 2 \
-
--mapreduce-job-name FromMySQLToHive0 \
-
--delete-target-dir \
-
--create-hive-table \
-
--hive-database hive_data2 \
-
--hive-table emp_sqoop111 \
- --hive-import
-
- #檢視匯入Hive表資料
-
hive> select * from emp_sqoop111;
OK
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30 -
- 分析:
-
create-hive-table引數來自動建立表的方法會發現表裡面的欄位型別和我們所預期的不一樣,所以生產上一般先把Hive建立好,再來匯入
- #import匯入Hive表資料(帶分割槽)
-
- 第一步:
- #hive建立分割槽表和分割槽欄位
-
create table emp_partition
(empno int, ename string, job string, mgr int, hiredate string, salary double, comm double, deptno int)
partitioned by (pt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' -
- 第二步:
- #指定hive的庫及匯入表和預設分割槽值
-
sqoop import \
--connect jdbc:mysql://localhost:3306/test \
--username root --password root \
--table emp -m 2 \
--mapreduce-job-name FromMySQLToHive1 \
--delete-target-dir \
--target-dir EMP_PARTITION \
--hive-database hive_data2 \
--hive-table emp_partition \
--hive-import \
--hive-partition-key 'pt' \
--hive-partition-value '2018-06-19' \
--fields-terminated-by '\t'
--hive-overwrite -
- 第三步:
-
#查詢匯入結果和分割槽值
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20 2018-06-19
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30 2018-06-19
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30 2018-06-19
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20 2018-06-19
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30 2018-06-19
-
分析:
--hive-database 匯入hive指向的資料名
--hive-table 匯入hive的表名
--hive-import 匯入hive必須引數
--hive-partition-key 分割槽欄位
--hive-partition-value 分割槽預設值值
--fields-terminated-by 列分隔
--hive-overwrite 表資料覆蓋
提示錯誤:
-
ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
cp hive-common-1.1.0-cdh5.7.0.jar $SQOOP_HOME/lib
cp hive-shims* $SQOOP_HOME/lib
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31441024/viewspace-2156087/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sqoop資料匯入匯出OOP
- sqoop定時增量匯入匯出OOP
- sqoop用法之mysql與hive資料匯入匯出OOPMySqlHive
- Angular Excel 匯入與匯出AngularExcel
- 【匯出匯入】匯出匯入 大物件物件
- sqoop1.4.7環境搭建及mysql資料匯入匯出到hiveOOPMySqlHive
- AWR跨庫匯出與匯入
- MongoDB資料匯入與匯出MongoDB
- Oracle匯入(imp )與匯出(exp )Oracle
- 【匯入匯出】sqlldr 匯入案例SQL
- 資料搬運元件:基於Sqoop管理資料匯入和匯出元件OOP
- 【匯出匯入】% 在匯入匯出中的應用。
- 伺服器批次匯入與匯出伺服器
- Mongodb資料的匯出與匯入MongoDB
- expdp與impdp全庫匯出匯入
- MySQL表資料匯入與匯出MySql
- AWR資料的匯出與匯入
- Mysql 資料庫匯入與匯出MySql資料庫
- Sqoop匯出ClickHouse資料到HiveOOPHive
- sqoop匯入orcle注意事項OOP
- Activity 流程模型匯入匯出-activity流程模型匯入匯出模型
- Mysql匯入&匯出MySql
- Mysql匯入匯出MySql
- doris匯入匯出
- js匯入匯出總結與實踐JS
- excel的匯入與匯出---通用版Excel
- MongoDB--Mongodb 中資料匯出與匯入MongoDB
- expdp與impdp全庫匯出匯入(二)
- DB2表的匯入與匯出DB2
- oracle10g匯出與匯入awrOracle
- 【匯入匯出】Oracle 常用匯入匯出工具集錦Oracle
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- vue excel匯入匯出VueExcel
- navlicat 匯入匯出SQLSQL
- mysql 命令匯入匯出MySql
- BCP匯入匯出MsSqlSQL
- mysql匯入匯出慢MySql
- mysql 匯入、匯出命令MySql