zoukankan      html  css  js  c++  java
  • sqoop安装和使用

    sqoop安装

    sqoop镜像:

    http://mirror.bit.edu.cn/apache/sqoop/  

    https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/

    http://archive.apache.org/dist/   #更多历史版本

    本教程:

    hadoop2.7.5   hdfs导入导出均成功

    hbase2.1.8 不能导出到mysql,能导入到hbase

    hive2.3.6  导入导出均成功

    1.解压、添加环境变量

    把sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz上传到linux的/opt/目录下,并解压。

    [root@master opt]# tar -zxvf ./ sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz       #解压文件到当前/opt目录

    [root@master opt]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop                #将文件夹名改为sqoop

    添加环境变量:

    [root@master opt]#  vi ~/.bash_profile

    添加如下代码:

    export SQOOP_HOME=/opt/sqoop

    export PATH=$SQOOP_HOME/bin:$PATH

    source ~/.bash_profile  #立即生效

    2.配置sqoop-env.sh

    [root@master conf]# cp sqoop-env-template.sh sqoop-env.sh  #赋值模板

    [root@master conf]# vi sqoop-env.sh  #编辑内容如下

    export HADOOP_COMMON_HOME=/opt/hadoop

    export HADOOP_MAPRED_HOME=/opt/hadoop

    export HBASE_HOME=/opt/hbase

    export HIVE_HOME=/opt/hive

    export ZOOCFGDIR=/opt/zookeeper

    export ZOOKEEPER_HOME=/opt/zookeepe     #这个没有加进去,是否有必要?

    3.拷贝JDBC驱动

    把mysql-connector-java-5.1.46.jar上传到linux的/opt/目录下

    [root@master opt]# cp mysql-connector-java-5.1.46.jar sqoop/lib

    4.验证sqoop

    [root@master opt]# sqoop version  #显示结果如下

    19/12/06 10:01:16 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7

    Sqoop 1.4.7

    git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8

    Compiled by maugli on Thu Dec 21 15:59:58 STD 2017

    测试sqoop能否连接mysql数据库

    [root@master bin]# ./sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password bigData@123    #显示结果如下

    information_schema

    hive

    mysql

    performance_schema

    sys

    到此说明sqoop安装正常。

    5.sqoop的使用案例

    sqoop的导入导出是相对hdfs而言,如果数据进入到hdfs,则为导入;从hdfs出则为导出。

    提前准备,启动集群:

    1.启动zookeeper

    zookeeper/bin/zkServer.sh start     #三个节点都要执行

    2.启动hadoop

    start-all.sh      #主节点启动

    3.启动hbase

    注意hbase没有添加环境变量

    hbase/bin/start-hbase.sh      #主节点启动

    主节点进程:

    [root@master opt]# jps

    2737 HMaster

    2865 HRegionServer

    1891 NameNode

    3061 Jps

    1735 QuorumPeerMain

    2056 SecondaryNameNode

    2239 ResourceManager

    在hdfs上创建目录/user/company

    [root@master opt]# hadoop fs -mkdir -p /user/company

    [root@master opt]# hadoop fs -ls /user

    Found 3 items

    drwxr-xr-x   - root supergroup          0 2019-12-06 11:01 /user/company

    drwxr-xr-x   - root supergroup          0 2019-11-25 17:44 /user/hive

    drwxr-xr-x   - root supergroup          0 2019-11-06 10:51 /user/root

    到此,准备工作完成,下面开始导入导出数据。

    5.1 导入数据

    5.1.1 RDBMS到HDFS

    1) 确定Mysql服务开启正常

    2) 在Mysql中新建一张表并插入一些数据

     [root@master bin]# mysql -uroot -pbigData@123

    mysql> create database company;   #创建数据库

    mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));   #创建表

    mysql> insert into company.staff(name, sex) values('Thomas', 'Male');

    mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');

    mysql> select * from staff;

    +----+----------+--------+

    | id | name     | sex    |

    +----+----------+--------+

    |  1 | Thomas   | Male   |

    |  2 | Catalina | FeMale |

    +----+----------+--------+

    2 rows in set (0.00 sec)

    mysql>

    3) 导入数据

             (1)全部导入

    [root@master bin]#./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --table staff

    --target-dir /user/company

    --delete-target-dir

    --num-mappers 1

    --fields-terminated-by " "

    查看hdfs上数据

    [root@master bin]# hadoop fs -ls /user/company

    Found 2 items

    -rw-r--r--   1 root supergroup          0 2019-12-06 11:07 /user/company/_SUCCESS

    -rw-r--r--   1 root supergroup         32 2019-12-06 11:07 /user/company/part-m-00000

    [root@master bin]# hadoop fs -cat /user/company/part-m-00000

    1       Thomas    Male

    2       Catalina   FeMale

    到此mysql-》hfs导入全部数据成功。

             (2)查询导入

    [root@master bin]#./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --target-dir /user/company

    --delete-target-dir

    --num-mappers 1

    --fields-terminated-by " "

    --query 'select name,sex from staff where id <=1 and $CONDITIONS;'

    提示:must contain '$CONDITIONS' in WHERE clause.

    如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

    [root@master bin]# hadoop fs -ls /user/company

    Found 2 items

    -rw-r--r--   1 root supergroup          0 2019-12-06 11:15 /user/company/_SUCCESS

    -rw-r--r--   1 root supergroup         12 2019-12-06 11:15 /user/company/part-m-00000

    [root@master bin]# hadoop fs -cat /user/company/part-m-00000

    Thomas    Male

    到此mysql-》hfs导入全部数据成功。

          (3)导入指定列

    [root@master bin]#./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --target-dir /user/company

    --delete-target-dir

    --num-mappers 1

    --fields-terminated-by " "

    --columns id,sex

    --table staff

    提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

          (4)使用sqoop关键字筛选查询导入数据

    [root@master bin]#./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --target-dir /user/company

    --delete-target-dir

    --num-mappers 1

    --fields-terminated-by " "

    --table staff

    --where "id=1"

    5.1.2 RDBMS到Hive

    ./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --table staff

    --num-mappers 1

    --hive-import

    --fields-terminated-by " "

    --hive-overwrite

    --hive-table staff_hive

    提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/root/表名 ??是否需要配置

    可能报错:见附件

    成功后如下:

    19/12/06 12:12:04 INFO hive.HiveImport: OK

    19/12/06 12:12:04 INFO hive.HiveImport: Time taken: 7.881 seconds

    19/12/06 12:12:05 INFO hive.HiveImport: Hive import complete.

    [root@master bin]#hive   #启动hive客户端

    [root@master bin]#show tables;

    OK

    staff_hive

    tb_chengdu

    Time taken: 15.665 seconds, Fetched: 2 row(s)

    hive> select * from staff_hive;

    OK

    1       Thomas    Male

    2       Catalina   FeMale

    Time taken: 6.43 seconds, Fetched: 2 row(s)

    hive>

    到此,rdbms导入数据到hive,成功。

    5.1.3 RDBMS到Hbase –待测试

    启动hbase客户端

    [root@master bin]# ./hbase shell

    ……

    Took 0.0054 seconds                                                                                              

    hbase(main):001:0>

    提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能

    hbase(main):001:0> create 'hbase_company','info'     #创建表

    Created table hbase_company

    Took 17.5040 seconds                                                                                             

    => Hbase::Table - hbase_company

    hbase(main):002:0> scan 'hbase_company'     #查看该表

    ROW                           COLUMN+CELL                                                                         

    0 row(s)

    Took 1.2565 seconds                                                                                              

    hbase(main):003:0>

    ./sqoop import

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --table staff

    --columns "id,name,sex"

    --column-family "info"

    --hbase-create-table

    --hbase-row-key "id"

    --hbase-table "hbase_company"

    --num-mappers 1

    --split-by id

    报错,见附件。先不调试这个。待测试

    5.2、导出数据

    在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。

    5.2.1 HIVE/HDFS到RDBMS

    ./sqoop export

    --connect jdbc:mysql://master:3306/company

    --username root

    --password bigData@123

    --table staff

    --num-mappers 1

    --export-dir /user/hive/warehouse/staff_hive

    --input-fields-terminated-by " "

    提示:Mysql中如果表不存在,不会自动创建

    因为之前mysql的staff有两条记录,所以需要先删除掉。

    ……

    19/12/06 20:13:13 INFO mapreduce.ExportJobBase: Exported 2 records.

    [root@master bin]#

    如上成功导出两条数据。

    再到mysql客户端查询staff表,数据成功显示。

     

    到此,hive导出数据到mysql完成。

    5.3 脚本打包

    使用opt格式的文件打包sqoop命令,然后执行。删除staff的两条记录。

    delete from staff;

    1) 创建一个.opt文件

    [root@master sqoop]# mkdir opt

    [root@master sqoop]# touch opt/job_HDFS2RDBMS.opt

    [root@master sqoop]# vi opt/job_HDFS2RDBMS.opt     #编辑如下内容

    2) 编写sqoop脚本

    export

    --connect

    jdbc:mysql://master:3306/company

    --username

    root

    --password

    bigData@123

    --table

    staff

    --num-mappers

    1

    --export-dir

    /user/hive/warehouse/staff_hive

    --input-fields-terminated-by

    " "     #注意,这里必须换行,不能和参数写在一行

    3) 执行该脚本

    $ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt

    结果

    19/12/06 20:38:23 INFO mapreduce.ExportJobBase: Transferred 178 bytes in 63.5468 seconds (2.8011 bytes/sec)

    19/12/06 20:38:23 INFO mapreduce.ExportJobBase: Exported 2 records.

    [root@master sqoop]#

    上诉结果显示已成功导出。

    查看mysql的staff表,数据已导入。

    ========

    作者:geiliHe   2019年12月6日星期五 晚

    =========

    附件:

    1:rdbms导入到hive错误

    问题1:Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.Hi

    #复制hive/lib/ hive-common-2.3.6.jar  到sqoop的lib下

    [root@master lib]# cp hive-common-2.3.6.jar /opt/sqoop/lib

    问题2:Output directory hdfs://master:9000/user/root/staff already exists

    手动删除

    [root@master bin]# hadoop fs -rm -R /user/root/staff

    问题3:INFO conf.HiveConf: Found configuration file null.

    这个错误主要的原因是没有配好 Hive-site.xml 的路径。

    这个路径是通过HIVE_CONF_DIR来指定的,如果没有指定则需要 HIVE_HOME 定义好。

    正确的配置是 HIVE_CONF_DIR=/opt/hive/conf 一定要定义到 conf 文件夹。

    而定义这个HIVE_CONF_DIR的变量文件是 SQOOP_HOME/conf/sqoop-env.sh。

    2.rdms导入数据到hbase错误

    问题1:19/12/06 12:52:45 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps

    Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.<init>(Lorg/apache/hadoop/conf/Configuration;)V

    原因是:

    新的Hbase版本使用了新的Api,不支持老的api了。Sqoop-1.4.6需要使用Hbase-1.0(包括1.0)以前的版本

    解决办法:将自己的sqoop版本提高或者将hbase的版本降低

    https://blog.csdn.net/w3045872817/article/details/78175959  //待测试

  • 相关阅读:
    MySQL严格模式总结
    python筛选关键字---error
    将pem证书转换成p12格式证书
    ## 游戏网关源码赏析
    pid获取
    顺序io_磁盘队列
    nsq源码阅读3_编译nsqd
    nsq源码阅读2_核心数据结构
    nsq源码阅读1_目录结构
    如何设计Mqtt的Retain?
  • 原文地址:https://www.cnblogs.com/hemomo/p/12271646.html
Copyright © 2011-2022 走看看