sqoop部署及匯入與匯出

13545163656發表於2018-06-13
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

  1. export SQOOP_HOME=/home/hadoop/app/sqoop-1.4.6
  2. export PATH=$SQOOP_HOME/bin:$PATH
[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

  1. #配置hadoop 和 hive絕對
  2. #Set path to where bin/hadoop is available
  3. export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.8.1
  4. #Set path to where hadoop-*-core.jar is available
  5. export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.8.1
  6. #set the path to where bin/hbase is available
  7. #export HBASE_HOME=
  8. #Set the path to where bin/hive is available
  9. export HIVE_HOME=/home/hadoop/app/hive-1.1.0
複製mysql驅動到$SQOOP_HOME/lib 

三.啟動並驗證
  1. [hadoop@hadoop001 bin]$ sqoop
  2. Warning: /home/hadoop/app/sqoop-1.4.6/../hbase does not HBase imports will fail.
  3. Please set $HBASE_HOME to the root of your HBase installation.
  4. Warning: /home/hadoop/app/sqoop-1.4.6/../hcatalog does not HCatalog jobs will fail.
  5. Please set $HCAT_HOME to the root of your HCatalog installation.
  6. Warning: /home/hadoop/app/sqoop-1.4.6/../accumulo does not Accumulo imports will fail.
  7. Please set $ACCUMULO_HOME to the root of your Accumulo installation.
  8. Warning: /home/hadoop/app/sqoop-1.4.6/../zookeeper does not Accumulo imports will fail.
  9. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
  10. Try 'sqoop help' for usage.
  11. #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

  1. [hadoop@hadoop001 bin]$ sqoop help export
  2. [hadoop@hadoop001 bin]$ sqoop help import


2.sqoop匯出
一.HDFS匯入到MySQL
1) 檢視HDFS檔案資料
  1. [hadoop@hadoop001 ~]$ hadoop fs -cat /user/hive/warehouse/hive_data2.db/emp/emp* 
  2. 7369 SMITH CLERK 7902 1980-12-17 800.00 20
  3. 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
  4. 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
  5. 7566 JONES MANAGER 7839 1981-4-2 2975.00 20
  6. 7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
  7. 7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
  8. 7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
  9. 7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
  10. 7839 KING PRESIDENT 1981-11-17 5000.00 10
  11. 7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
  12. 7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
  13. 7900 JAMES CLERK 7698 1981-12-3 950.00 30
  14. 7902 FORD ANALYST 7566 1981-12-3 3000.00 20
  15. 7934 MILLER CLERK 7782 1982-1-23 1300.00 10
  16. 8888 HIVE PROGRAM 7839 1988-1-23 10300.00
2) MySQL資料庫建立emp
  1. create table emp
  2. (empno int,
  3.  ename varchar(255),
  4.  job varchar(255),
  5.  mgr int,
  6.  hiredate varchar(255),
  7.  salary double,
  8.  comm double,
  9.  deptno int)

3) HDFS匯入MySQL
資料庫emp
  1. sqoop export \
  2. --connect jdbc:mysql://localhost:3306/test \
  3. --username root --password root \
  4. --mapreduce-job-name FromHDFSToMySQL1 \
  5. --table emp \
  6. -m 3 \
  7. --export-dir /user/hive/warehouse/hive_data2.db/emp/emp* \
  8. --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表:

  1. mysql> select * from emp;
  2. +-------+--------+-----------+------+------------+--------+------+--------+
  3. | empno | ename | job | mgr | hiredate | salary | comm | deptno |
  4. +-------+--------+-----------+------+------------+--------+------+--------+
  5. | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 |
  6. | 7499 | ALLEN | SALESMAN | 7698 | 1981-2-20 | 1600 | 300 | 30 |
  7. | 7521 | WARD | SALESMAN | 7698 | 1981-2-22 | 1250 | 500 | 30 |
  8. | 7566 | JONES | MANAGER | 7839 | 1981-4-2 | 2975 | NULL | 20 |
  9. | 7654 | MARTIN | SALESMAN | 7698 | 1981-9-28 | 1250 | 1400 | 30 |
  10. | 7698 | BLAKE | MANAGER | 7839 | 1981-5-1 | 2850 | NULL | 30 |
  11. | 7782 | CLARK | MANAGER | 7839 | 1981-6-9 | 2450 | NULL | 10 |
  12. | 7788 | SCOTT | ANALYST | 7566 | 1987-4-19 | 3000 | NULL | 20 |
  13. | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
  14. | 7844 | TURNER | SALESMAN | 7698 | 1981-9-8 | 1500 | 0 | 30 |
  15. | 7876 | ADAMS | CLERK | 7788 | 1987-5-23 | 1100 | NULL | 20 |
  16. | 7900 | JAMES | CLERK | 7698 | 1981-12-3 | 950 | NULL | 30 |
  17. | 7902 | FORD | ANALYST | 7566 | 1981-12-3 | 3000 | NULL | 20 |
  18. | 7934 | MILLER | CLERK | 7782 | 1982-1-23 | 1300 | NULL | 10 |
  19. | 8888 | HIVE | PROGRAM | 7839 | 1988-1-23 | 10300 | NULL | NULL |
  20. +-------+--------+-----------+------+------------+--------+------+--------+
  21. 15 rows in set (0.00 sec)

遇到錯誤:
  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject

  1. 解決辦法:
  2. 複製java-json.jar新增到$sqoop_home/lib目錄下

  3. java-json.jar下載地址:
  4. http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm

4) HDFS匯入MySQL資料庫emp(指定欄位匯入和條件)
  1. sqoop export \
  2. --connect jdbc:mysql://localhost:3306/test \
  3. --username root --password root \
  4. --mapreduce-job-name FromHDFSToMySQL1 \
  5. --table emp_2 \
  6. -m 3 \
  7. --export-dir /user/hive/warehouse/hive_data2.db/emp/emp* \
  8. --columns 'EMPNO,ENAME,JOB' \
  9. --fields-terminated-by '\t' \
  10. --null-string '' --null-non-string '0'
#指定匯入欄位
--columns 'EMPNO,ENAME,JOB'  
#string型別的NUll和非string型別的null轉換
--null-string '' --null-non-string '0'

  1. mysql> select * from emp_2;
  2. +-------+--------+-----------+------+----------+--------+------+--------+
  3. | empno | ename | job | mgr | hiredate | salary | comm | deptno |
  4. +-------+--------+-----------+------+----------+--------+------+--------+
  5. | 7876 | ADAMS | CLERK | NULL | NULL | NULL | NULL | NULL |
  6. | 7900 | JAMES | CLERK | NULL | NULL | NULL | NULL | NULL |
  7. | 7902 | FORD | ANALYST | NULL | NULL | NULL | NULL | NULL |
  8. | 7934 | MILLER | CLERK | NULL | NULL | NULL | NULL | NULL |
  9. | 8888 | HIVE | PROGRAM | NULL | NULL | NULL | NULL | NULL |
  10. | 7369 | SMITH | CLERK | NULL | NULL | NULL | NULL | NULL |
  11. | 7499 | ALLEN | SALESMAN | NULL | NULL | NULL | NULL | NULL |
  12. | 7521 | WARD | SALESMAN | NULL | NULL | NULL | NULL | NULL |
  13. | 7566 | JONES | MANAGER | NULL | NULL | NULL | NULL | NULL |
  14. | 7654 | MARTIN | SALESMAN | NULL | NULL | NULL | NULL | NULL |
  15. | 7698 | BLAKE | MANAGER | NULL | NULL | NULL | NULL | NULL |
  16. | 7782 | CLARK | MANAGER | NULL | NULL | NULL | NULL | NULL |
  17. | 7788 | SCOTT | ANALYST | NULL | NULL | NULL | NULL | NULL |
  18. | 7839 | KING | PRESIDENT | NULL | NULL | NULL | NULL | NULL |
  19. | 7844 | TURNER | SALESMAN | NULL | NULL | NULL | NULL | NULL |

3.sqoop匯入

一.MySQL匯入到HDFS
#查詢當前的資料庫
  1. sqoop list-databases \
  2. --connect jdbc:mysql://localhost:3306 \
  3. --username root --password root
 結果:
 information_schema
 hive_data
 mysql
 performance_schema
 test
#查詢資料庫下的所有的表
  1. sqoop list-tables \
  2. --connect jdbc:mysql://localhost:3306/test \
  3. --username root
  4. 結果:
  5. emp
    emp_2
#MySQL匯入到hdfs
  1. #import匯入
  2. [hadoop@hadoop001 bin]$ sqoop import \
  3. > --connect jdbc:mysql://localhost:3306/test \
  4. > --username root --password root \
  5. > --table emp_2

  6. #檢視匯入檔案
  7. [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


  1. 分析:
  2.  --預設匯入hdfs路徑為/user/hadoop/表名/檔案
     --預設mapreduce作業名為表名
     --預設併發TapTask數-m為4個
     --預設列的分割符為逗號


  #import條件匯入
  1. [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'
  1.  #檢視匯入檔案
  1.  [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

  分析:
    1.  --預設匯入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前新增\轉義符

提示錯誤:
  1. 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

原理:

  1. Sqoop通可以過–split-by指定切分的欄位,–m設定mapper的數量。透過這兩個引數分解生成m個where子句,進行分段查詢。
  2. split-by 根據不同的引數型別有不同的切分方法,如表共有100條資料其中id為int型別,並且我們指定–split-by id,我們不設定map數量使用預設的為四個,首先Sqoop會取獲取切分欄位的MIN()和MAX()即(–split -by),再根據map數量進行劃分,這是欄位值就會分為四個map:(1-25)(26-50)(51-75)(75-100)。
  3. 根據MIN和MAX不同的型別採用不同的切分方式支援有Date,Text,Float,Integer, Boolean,NText,BigDecimal等等。
  4. 所以,若匯入的表中沒有主鍵,將-m 設定稱1或者設定split-by,即只有一個map執行,缺點是不能並行map錄入資料。(注意,當-m 設定的值大於1時,split-by必須設定欄位) 。
  5. split-by即便是int型,若不是連續有規律遞增的話,各個map分配的資料是不均衡的,可能會有些map很忙,有些map幾乎沒有資料處理的情況


二.MySQL匯入到Hive

    1. #import匯入Hive
    sqoop import \
  1. --connect jdbc:mysql://localhost:3306/test \
  2. --username root --password root \
  3. --table emp -m 2 \
  4. --mapreduce-job-name FromMySQLToHive0 \
  5. --delete-target-dir \
  6. --create-hive-table \
  7. --hive-database hive_data2 \
  8. --hive-table emp_sqoop111 \
  9. --hive-import

  1. #檢視匯入Hive表資料
  2. 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
    1. 分析:
  3.  create-hive-table引數來自動建立表的方法會發現表裡面的欄位型別和我們所預期的不一樣,所以生產上一般先把Hive建立好,再來匯入

    1. #import匯入Hive表資料(帶分割槽)

    2. 第一步:
    3. #hive建立分割槽表和分割槽欄位
    4. 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'

    5. 第二步:
    6. #指定hive的庫及匯入表和預設分割槽值
    7. 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

    8. 第三步
    9. #查詢匯入結果和分割槽值
      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

    1. 分析:
      --hive-database  匯入hive指向的資料名

      --hive-table     匯入hive的表名    
      --hive-import    匯入hive必須引數
      --hive-partition-key    分割槽欄位
      --hive-partition-value  分割槽預設值值
      --fields-terminated-by  列分隔
      --hive-overwrite        表資料覆蓋




提示錯誤:
  1.  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章