Hadoop Sqoop

Sqoop是什么?

Sqoop是Apache下用于关系数据库(RDBMS)和HDFS互相导数据的一个工具。

使用

2.1 命令说明

查看Sqoop命令说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sqoop help
usage: sqoop COMMAND [ARGS]

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
list-databases List available databases on a server
list-tables List available tables in a database
version Display version information

See 'sqoop help COMMAND' for information on a specific command.

也可以查看某一个命令的说明

1
$sqoop import --help

Sqoop import demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 直接写入参数
sqoop import
--connect jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password
redhat
--table
tutor_abc

# 也可以以文件的方式传入
$sqoop --option-file
~/Desktop/config.txt -- table tutor_abc

$cat ~/Desktop/config.txt

import
--connect
jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password
redhat

2.2 导入数据到HDFS

话不多说,直接看看生产环境的参数吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import-all-tables
--connect
jdbc:mysql://mysql-myhost:3306/tutor_banner?useUnicode=true&characterEncoding=UTF-8
--username
zhangyang
--password
zhangyangisahandsome
--warehouse-dir
/sqoop/tutor_banner
--mysql-delimiters
--m
2
--direct
--
--default-character-set=utf8

从以上代码可以看到,除了--connect,--username,--password这几个基本参数以外,还有--warehouse-dir|
--mysql-delimiters|-m|--direct|--default-character-set=utf8这几个参数,我们就依次来看看是意思

  • --connect,--username,--password : 这几个是为Sqoop连接RDBMS传入的参数,知道就好。
  • --warehouse-dir : 与 --target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录
  • --target-dir : 指定的HDFS目录
  • --mysql-delimiters :
  • -m : 启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数
  • --direct : 直接导入模式,使用的是关系数据库自带的导入导出工具。官网上这是最快的方式
  • --mysql-delimiters : Mysql默认的分隔符设置,字段之间以,隔开,行之间以换行\n隔开,默认转义符号是\,字段值以单引号’包含起来。
  • --default-character-set=utf-8 : 顾名思义

code demo

1
2
3
4
5
6
7
8
#指定从TBLS里面导入tal_id,create_time两列,且tab_id满足>1的条件,导入到/user/hive/result下
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --columns "tbl_id,create_time" --where "tbl_id > 1" --target-dir /user/hive/result

#使用SQL语句查询:1)需要指定\$CONDITIONS;2)需要指定--split-by,以分隔工作量;3)必须指定--target-dir目录
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where tab_id <1000 and $CONDITIONS ' --split-by tbl_id -m 2 --target-dir /user/hive/result

#指定文件输出格式
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --target-dir /user/hive/result

2.3 创建Hive表

生成与关系数据库相对应的Hive表

1
2
3
4
5
6
$sqoop --create-hive-table --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS 

#参数:
--hive-overwrite : 覆盖掉在hive表中已经存在的数据
--create-hive-table : 默认是false,如果目标表已经存在了,那么创建任务会失败
--hive-table : 后面接要创建的hive表

2.4 导入数据到Hive

执行下面的命令会将 mysql 中的数据导入到 hdfs 中,然后创建一个hive 表,最后再将 hdfs 上的文件移动到 hive 表的目录下面。

1
2
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" 
--hive-import --hive-overwrite --create-hive-table --hive-table dw_srclog.TBLS --delete-target-dir

Tips : Sqoop 默认地导入空值(NULL)为 null 字符串,而 hive 使用 \N 去标识空值(NULL),故你在 import 或者 export 时候,需要做相应的处理。

1
2
3
4
5
# 在 import 时,使用如下命令
$ sqoop import ... --null-string '\\N' --null-non-string '\\N'

#在导出时,使用下面命令
$ sqoop import ... --input-null-string '' --input-null-non-string ''

2.5 增量导入

参数 说明
--check-column (col) 用来作为判断的列名,如id
--incremental (mode) append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
--last-value (value) 指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值

2.6 合并HDFS文件

将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中

1
2
#将/test/p1/person与/test/p2/person合并,放到/test/merged这个目录下,其中优先保留–new-data参数后的数据
sqoop merge –new-data /test/p1/person –onto /test/p2/person –target-dir /test/merged –jar-file /opt/data/sqoop/person/Person.jar –class-name Person –merge-key id

参考文章

感恩作者JavaChen:)
文章内容大部分来自Sqoop导入关系数据库到Hive