一:Sqoop组件安装与配置

1.1:实验环境

  • 服务器集群 - 3 个以上节点,节点间网络互通,各节点最低配置:双核 CPU、8GB 内存、100G硬盘
  • 运行环境 - CentOS 7.4

    1.2:下载和解压Sqoop

    Sqoop相关发行版本可以通过官网 https://mirror-hk.koddos.net/apache/sqoop/来获取,
    图片说明
    安装 Sqoop 组件需要与 Hadoop 环境适配。使用 root 用户在 Master 节点上进行部署,将 /opt/software/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 压缩包解压到/usr/local/src 目录下。
    [root@master ~]# tar -zxvf /opt/software/sqoop-1.4.7.bin__hadoop2.6.0.tar.gz -C /usr/local/src
    将解压后生成的 sqoop-1.4.7.bin__hadoop-2.6.0 文件夹更名为 sqoop。
    [root@master ~]# cd /usr/local/src/
    [root@master src]#mv ./sqoop-1.4.7.bin__hadoop-2.6.0 sqoop

    1.3:配置Sqoop环境

    1.3.1:创建 Sqoop 的配置文件 sqoop-env.sh。

    复制 sqoop-env-template.sh 模板,并将模板重命名为 sqoop-env.sh。
    [root@master ~]# cd /usr/local/src/sqoop/conf/
    [root@master conf]# cp sqoop-env-template.sh sqoop-env.sh

    1.3.2:修改 sqoop-env.sh 文件,添加 Hdoop、Hbase、Hive 等组件的安装路径。

    注意,下面各组件的安装路径需要与实际环境中的安装路径保持一致。
    [root@master conf]# vi sqoop-env.sh
    export HADOOP_COMMON_HOME=/usr/local/src/hadoop
    export HADOOP_MAPRED_HOME=/usr/local/src/hadoop
    export HBASE_HOME=/usr/local/src/hbase
    export HIVE_HOME=/usr/local/src/hive

    1.3.3:配置 Linux 系统环境变量,添加 Sqoop 组件的路径。

    [root@master conf]# vi /etc/profile
    #在文件末尾添加
    # set sqoop environment
    export SQOOP_HOME=/usr/local/src/sqoop
    export PATH=$PATH:$SQOOP_HOME/bin
    export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib

    1.3.4:连接数据库

    为了使 Sqoop 能够连接 MySQL 数据库,需要将/opt/software/mysql-connector-java-5.1.46.jar 文件放入 sqoop 的 lib 目录中。该 jar 文件的版本需要与MySQL 数据库的版本相对应,否则 Sqoop 导入数据时会报错。(mysql-connector-java-5.1.46.jar 对应的是 MySQL 5.7 版本)若该目录没有 jar 包,则使用第 6 章导入 home 目录的 jar 包
    [root@master ~]# cp /opt/software/mysql-connector-java-5.1.46.jar /usr/local/src/sqoop/lib/
    ##1.4:启动Sqoop
    ###1.4.1:执行 Sqoop 前需要先启动 Hadoop 集群。
    在 master 节点切换到 hadoop 用户执行 start-all.sh 命令启动 Hadoop 集群。
    [root@master ~]# su - hadoop
    [hadoop@master ~]$ source /etc/profile
    [hadoop@master ~]$ start-all.sh
    ###1.4.2:检查 Hadoop 集群的运行状态。
    [hadoop@master ~]$ jps
    1457 NameNode
    1795 ResourceManager
    2060 Jps
    1646 SecondaryNameNode
    ###1.4.3:测试 Sqoop 是否能够正常连接 MySQL 数据库。
    # Sqoop 连接 MySQL 数据库 P 大写 密码 Password123$
    [hadoop@master ~]$
    sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username
    root -P
    Warning: /home/hadoop/sqoop/../hcatalog does not exist! HCatalog
    jobs will fail.
    Please set $HCAT_HOME to the root of your HCatalog installation.
    Warning: /home/hadoop/sqoop/../accumulo does not exist! Accumulo
    imports will fail.
    Please set $ACCUMULO_HOME to the root of your Accumulo
    installation.
    Warning: /home/hadoop/sqoop/../zookeeper does not exist!
    Accumulo imports will fail.
    Please set $ZOOKEEPER_HOME to the root of your Zookeeper
    installation.
    19/04/22 18:54:10 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
    Enter password: # 此处需要输入 mysql 数据库的密码
    19/04/22 18:54:14 INFO manager.MySQLManager: Preparing to use a
    MySQL streaming resultset.
    information_schema
    hive
    mysql
    performance_schema
    sys
    能 够 查 看 到 MySQL 数 据 库 中 information_schema 、 hive 、 mysql 、performance_schema、sys 等数据库,说明 Sqoop 可以正常连接 MySQL。

    1.4.4:连接hive

    为了使 Sqoop 能够连接 Hive,需要将 hive组件/usr/local/src/hive/lib 目录下的hive-common-2.0.0.jar 也放入 Sqoop 安装路径的 lib 目录中。
    [hadoop@master ~] cp /usr/local/src/hive/lib/hive-common-2.0.0.jar /usr/local/src/sqoop/lib/

    1.5:Sqoop模板命令

    1.5.1:创建MySql数据库和数据表。

      登录 MySQL 数据库
      [hadoop@master ~]$ mysql -uroot -p
      Enter password:
      # 创建 sample 库
      mysqlcreate database sample;
      Query OK, 1 row affected (0.00 sec)
      # 使用 sample 库
      mysqluse sample;
      Database changed
      mysqlcreate table student(number char(9) primary key, name varchar(10));
      Query OK, 0 rows affected (0.01 sec) # 创建 student 表,该数据表有
      number 学号和 name 姓名两个字段
      # 向 student 表插入几条数据
      mysqlinsert into student values('01','zhangsan');
      Query OK, 1 row affected (0.05 sec)
      mysqlinsert into student values('02','lisi');
      Query OK, 1 row affected (0.01 sec)
      mysqlinsert into student values('03','wangwu');
      Query OK, 1 row affected (0.00 sec)
      mysql>
      mysql>
      # 查询 student 表的数据
      mysqlselect * from student;
      +--------+----------+
      | number | name |
      +--------+----------+
      | 01 | zhangsan |
      | 02 | lisi |
      | 03 | wangwu |
      +--------+----------+
      3 rows in set (0.00 sec)
      mysql>
      mysqlexit 

    1.5.2:在 Hive 中创建 sample 数据库和 student 数据表。

    [hadoop@master ~]$ hive # 启动 hive 命令行
    Logging initialized using configuration in
    jar:file:/usr/local/src/hive/lib/hive-common-1.1.0.jar!/hivelog4j.properties
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in
    [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-
    1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hivejdbc-1.1.0-
    standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings
    for an explanation.
    SLF4J: Actual binding is of type
    [org.slf4j.impl.Log4jLoggerFactory]
    hivecreate database sample; # 创建 sample 库
    OK
    Time taken: 0.679 seconds
    hiveshow databases; # 查询所有数据库
    OK
    default
    Time taken: 0.178 seconds, Fetched: 2 row(s)
    hiveuse sample; # 使用 sample 库
    OK
    hivecreate table student(number STRING, name STRING)
    row format delimited
    fields terminated by "|"
    stored as textfile; # 创建 student 表
    OK
    hiveexit;  退出 hive 命令行

    1.5.3:从 MySQL 导出数据,导入 Hive。

    需要说明该命令的以下几个参数:
    1)--connect:MySQL 数据库连接 URL。
    2)--username 和--password:MySQL 数据库的用户名和密码。
    3)--table:导出的数据表名。
    4)--fields-terminated-by:Hive 中字段分隔符。
    5)--delete-target-dir:删除导出目的目录。
    6)--num-mappers:Hadoop 执行 Sqoop 导入导出启动的 map 任务数。
    7)--hive-import --hive-database:导出到 Hive 的数据库名。
    8)--hive-table:导出到 Hive 的表名。

    [hadoop@master ~]$ sqoop
    import --connect jdbc:mysql://master:3306/sample --username root --password
    Password123$ --table student --fields-terminated-by '|' --delete-target-dir -
    -num-mappers 1 --hive-import --hive-database sample --hive-table student
    删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据
    [hadoop@master ~]$mysql -u root -p #密码 Password123$
    mysql>use sample;
    mysql>delete from student;
    mysql>exit;

1.5.4:从 Hive 导出数据,导入到 MySQL。

需要说明该命令的以下几个参数:
1)--connect:MySQL 数据库连接 URL。
2)--username 和--password:MySQL 数据库的用户名和密码。
3)--table:导出的数据表名。
4)--fields-terminated-by:Hive 中字段分隔符。
6)--export-dir:Hive 数据表在 HDFS 中的存储路径。

[hadoop@master ~]$ sqoop export --connect
"jdbc:mysql://master:3306/sample?useUnicode=true&characterEncoding=utf-8" --
username root --password Password123$ --table student --input-fie

1.6:Sqoop组件应用

Sqoop 常用设置命令如下:
(1)列出 MySQL 数据库中的所有数据库。

[hadoop@master ~]$ sqoop list-databases -connect
jdbc:mysql://localhost:3306/ -username root -password Password123$

(2)连接 MySQL 并列出 sample 数据库中的表。

[hadoop@master ~]$ sqoop list-tables -connect jdbc:mysql://localhost:3306/sample -username root -password Password123$

(3)将关系型数据的表结构复制到 hive 中,只是复制表的结构,表中的内容没有复制
过去。

[hadoop@master ~]$ sqoop create-hive-table -connect jdbc:mysql://localhost:3306/sample -table student -username root -password Password123$ -hive-table test

其中–table student 为 MySQL 中的数据库 sample 中的表–hive-table test 为 hive
中新建的表名称。
(4)从关系数据库导入文件到 Hive 中。

[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --delete-target-dir --num-mappers 1 --hive-import --hive-database default --hive-table test

(5)将 Hive 中的表数据导入到 MySQL 中,在进行导入之前,MySQL 中的表
hive_test 表必须已经提前创建好。

删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据
[hadoop@master ~]$mysql -u root -p #密码 Password123$
mysql>use sample;
mysql>delete from student;
mysql>exit;
[hadoop@master ~]$ sqoop export -connect jdbc:mysql://master:3306/sample --username root -password Password123$ -table student --input-fields-terminatedby '\001' -export-dir /user/hive/warehouse/test

(6)从数据库导出表的数据到 HDFS 上文件。

[hadoop@master ~]$ sqoop import -connect jdbc:mysql://master:3306/sample --username root -password Password123$ -table student --num-mappers 1 -targetdir /user/test

(7)从数据库增量导入表数据到 HDFS 中。

#密码 Password123$
[hadoop@master ~]$mysql -u root -p
mysql>use sample;
mysqlinsert into student values('04','sss');
mysqlinsert into student values('05','ss2');
mysqlinsert into student values('06','ss3');
#非数值型的值不能当做增量
mysqlalter table student modify column number int;
mysqlexit;
[hadoop@master ~]$sqoop import -connect jdbc:mysql://master:3306/sample -
username root -password Password123$ -table student --num-mappers 1 -targetdir /user/test -check-column number -incremental append -last-value 0
查看导入数据
[hadoop@master ~]$hdfs dfs -cat /user/test/part-m-00000