大数据
基础组件

Sqoop的简单使用

简介:Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(MySQL、PostgreSQL等)间进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、PostgreSQL等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

1. Sqoop

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(MySQL、PostgreSQL等)间进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、PostgreSQL等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

1.1. Sqoop的安装

Sqoop的安装非常简单,解压,配置环境变量即可:

  • ubuntu@s100:~/software$ tar zxf sqoop-1.4.2.bin__hadoop-2.0.0-alpha.tar.gz -C /soft/
  • ubuntu@s100:~/software$ cd /soft/
  • ubuntu@s100:/soft$ ln -s sqoop-1.4.2.bin__hadoop-2.0.0-alpha sqoop

配置环境变量:

  • JAVA_HOME=/soft/jdk
  • HADOOP_HOME=/soft/hadoop
  • HIVE_HOME=/soft/hive
  • HBASE_HOME=/soft/hbase
  • ZK_HOME=/soft/zk
  • PIG_HOME=/soft/pig
  • SQOOP_HOME=/soft/sqoop
  • PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/soft/jdk/bin:/soft/hadoop/bin:/soft/hadoop/sbin:/soft/eclipse:/soft/maven/bin:/soft/hive/bin:/soft/hbase/bin:/soft/zk/bin:/soft/pig/bin:/soft/sqoop/bin"

因为需要操作MySQL数据库,所以还需要将MySQL的连接Jar包放置在${SQOOP_HOME}/lib目录下,这里使用的是5.1.18版本:

  • ubuntu@s100:~/software$ cp mysql-connector-java-5.1.18.jar /soft/sqoop/lib/

1.2. Sqoop导入

  1. 有主键的表进行导入
  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata --driver com.mysql.jdbc.Driver --username root --password 1234 --table data --columns id,value --m 1 --target-dir /user/ubuntu/data/sqoop/data1

即:

  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table data \ # 需要导入的表名
  • > --columns id,value \ # 需要导入的字段
  • > --m 1 \ # MapReduce过程中使用的Mapper个数
  • > --target-dir /user/ubuntu/data/sqoop/data1 # 存入的HDFS目录

查看导入的数据:

  • ubuntu@s100:~/software$ hdfs dfs -ls -R /user/ubuntu/data/sqoop/data1
  • -rw-r--r-- 3 ubuntu supergroup 0 2017-07-18 08:27 /user/ubuntu/data/sqoop/data1/_SUCCESS
  • -rw-r--r-- 3 ubuntu supergroup 54 2017-07-18 08:27 /user/ubuntu/data/sqoop/data1/part-m-00000
  • ubuntu@s100:~/software$ hdfs dfs -cat /user/ubuntu/data/sqoop/data1/part-m-00000
  • 1,hello world tom
  • 2,hello world tom
  • 3,hello world tom
  1. 增量导入
  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata --driver com.mysql.jdbc.Driver --username root --password 1234 --table data --columns id,value --m 1 --target-dir /user/ubuntu/data/sqoop/data1 --check-column id --incremental append --last-value 4

即:

  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table data \ # 需要导入的表名
  • > --columns id,value \ # 需要导入的字段
  • > --m 1 \ # MapReduce过程中使用的Mapper个数
  • > --target-dir /user/ubuntu/data/sqoop/data1 # 存入的HDFS目录
  • > --check-column id # 判断增量的字段
  • > --incremental append # 增量方式
  • > --last-value 4 # 增量的起始字段值
  1. 导入无主键的表
  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table data \ # 需要导入的表名
  • > --target-dir /user/ubuntu/data/sqoop/data2 \ # 存入的HDFS目录
  • > -m 1 \ #使用一个map
  • > --split-by id # 也可以使用该属性指定切割字段

1.3. 导出

  • ubuntu@s100:~$ sqoop export --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table data1 \ # 需要导入的表名
  • > --columns id,value \ # 导出的字段
  • > --m 3 \ # 使用的Mapper数量
  • > --export-dir /user/ubuntu/data/sqoop/data2 # 源数据的HDFS路径

2. 使用Sqoop导入数据到Hive

如果Hadoop配置了HA,需要将Hive的元数据表(位于MySQL)中的dbs和sds表中的对应信息修改为HA集群的信息:

  • mysql> update dbs set DB_LOCATION_URI='hdfs://mycluster/user/hive/warehouse' where DB_ID = 1 ;
  • mysql> update dbs set DB_LOCATION_URI='hdfs://mycluster/user/hive/warehouse/myhive.db' where DB_ID = 3 ;
  • mysql> update sds set LOCATION = 'hdfs://mycluster/user/hive/warehouse/myhive.db/t3' where sd_id = 26 and cd_id = 31 ;

从MySQL中导入数据到Hive:

  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table tmp \ #需要导入的表名
  • > --hive-import \ # 表明是导入到Hive
  • > --create-hive-table \ # 表名需要创建Hive表
  • > --hive-table myhive.tmp # 创建的Hive的表名

3. 使用Sqoop导入数据到HBase

HBase在HA的配置下也需要调整相应的配置。在调整配置后,可以使用以下的命令将MySQL中的数据导入到HBase中:

  • ubuntu@s100:~$ sqoop import --connect jdbc:mysql://192.168.127.1:3306/bigdata \ # MySQL数据库地址及库名
  • > --driver com.mysql.jdbc.Driver \ # 数据库驱动类
  • > --username root \ # 数据库登录名
  • > --password 1234 \ # 数据库登录密码
  • > --table orders \ # 导入的表
  • > --hbase-create-table \ # 表明是否创建hbase表
  • > --hbase-table ns1:orders \ # 表明创建的表名
  • > --hbase-row-key id \ # 表明导入的列名
  • > --hbase-column-family f1 # 表明导入的列族

4. sqoop job

4.1. 常用的job命令

  • --create <job-id>:创建job
  • --delete <job-id>:删除job
  • --exec <job-id>:执行job
  • --help
  • --list:查看job列表
  • --meta-connect <jdbc-uri>
  • --show <job-id>:显式job的详情
  • --verbose:打印更多信息

4.2. 常见操作

  1. 创建job
  • ubuntu@s100:~$ sqoop job --create mysql2hbase -- import --connect jdbc:mysql://192.168.231.1:3306/big3 --driver com.mysql.jdbc.Driver --username root --password root --table orders --hbase-table ns1:orders --hbase-row-key id --column-family f1 -m 1
  1. 显示job列表
  • ubuntu@s100:~$ sqoop job --list
  1. 显示job详情
  • ubuntu@s100:~$ sqoop job --show mysql2hbase
  1. 执行job
  • ubuntu@s100:~$ sqoop job --exec mysql2hbase

注:上述命令会要求输入密码,输入是使用MySQL的账户的密码。

  1. 删除job
  • ubuntu@s100:~$ sqoop job --delete mysql2hbase