sqoop部署及导入与导出

1.sqoop安装
     CDH之 sqoop 下载 地址:http://archive.cloudera.com/cdh5/cdh/5

一.下载及环境配置
wget http://archive.cloudera.com/cdh5/cdh/5/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 

三.启动并验证
[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

  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 指定作业名
       --默认并发 TapTas k数 -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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31441024/viewspace-2156087/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值