Sqoop
1. 概念
Sqoop 是一款开源的数据迁移工具,主要用于在 Hadoop(Hive)与传统数据库(Mysql、Oracle...)间进行数据的相互传递,可以将一个关系型数据库(MySQL、Oracle、Postgres 等)中的数据导入到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导出到关系型数据库中。
Sqoop 语法实质上会转化成底层的 MapReduce。
2. 安装和配置
- 只要配置了 HADOOP_HOME,就会自动到 /etc/ 目录下读取配置(NameNode 和 ResourceManager)。
- 添加 Sqoop 到环境变量。
- 将数据库连接驱动拷贝到 $SQOOP_HOME/lib 里。
3. Sqoop 使用
1)将数据库中的数据导入到 HDFS 中
Mysql:
sqoop import --connect jdbc:mysql://192.168.2.113/test_sqoop --username root --password admin \
--table t_customer --columns 'id, account, income, expenses'
Oracle:
sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.117.190:1521:web2sys \ --username *** --password *** \ --hive-table BI_DWD_CDR_ANALYSIS_DAY --hive-partition-key pt --hive-partition-value "20170101" \ -m 1 --table BI_DWD_CDR_ANALYSIS_DAY --where "CALL_START_DT=20170101" --fields-terminated-by '\t' \ --class-name com.cmsz.imp.model.BI_DWD_CDR_ANALYSIS_DAY \ --jar-file /opt/mcb/web/lib/sqoop_table_lib.jar;
参数说明:
- append:将数据追加到 HDFS 上一个已存在的数据集上。
- hive-table:导入的 Hive 表名。
- connect:Oracle 的连接字符串,包含地址、SID、端口。
- target-dir:导入 HDFS 的目标路径,如果没有,则导入到默认路径。
- m2:使用 2 个 map 任务并行导入数据。若为 1,则没有开启并行导入功能,直接导入。
- split-by:按照哪一列分割数据,仅当表中没有主键时才可用。
- table:导入的 Oracle 源表表名。
- Columns:导入指定的列,如果导入指定的多列,参照 colummns column1,column2 格式。
- fields-terminated-by:字段分隔符,默认为“\001”。
- where:指定导出时所使用的查询条件。
- query:导入查询语句(不能与 --table 同时使用),后面必须接 where\$CONDITIONS。如:--query'select * from table where \$CONDITIONS'
示例:
- 指定输出路径、指定数据分隔符:
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 \
--table trade_detail --target-dir '/sqoop/td' --fields-terminated-by '\t'
- 增加 where 条件(条件必须用引号引起来):
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 \
--table trade_detail --where 'id>3' --target-dir '/sqoop/td2'
- 增加 query 语句(使用 \ 将语句换行):
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 \ --query 'SELECT * FROM trade_detail where id > 2 AND $CONDITIONS' --split-by trade_detail.id --target-dir '/sqoop/td3'
-
- where 后面的参数,AND $CONDITIONS 这个参数必须加上。
- 而且存在单引号与双引号的区别,如果 --query 后面使用的是双引号,那么需要在 $CONDITIONS 前加上 \ ,即 \$CONDITIONS。
- 如果设置 map 数量为 1 个时即 -m 1,则不用加上 --split-by ${tablename.column};否则需要加上(使用 id 字段性能更好)。
2)将 HDFS 上的数据导出到数据库中(不要忘记指定分隔符)
Mysql:
sqoop export --connect jdbc:mysql://192.168.8.120:3306/itcast --username root --password 123 \
--export-dir '/td3' --table td_bak -m 1 --fields-terminated-by ','
Oracle:
sqoop export --connect jdbc:oracle:thin:@192.168.117.190:1521:web2sys --username *** --password *** -m 1 \ --table BI_DW_RTS_GLOBAL_D --export-dir /user/arch/BI_DW_RTS_GLOBAL_D_20170101 \ --input-fields-terminated-by '\001' --input-null-string '\\N' --null-non-string '\\N' \ --class-name com.cmsz.exp.model.BI_DW_RTS_GLOBAL_D \ --jar-file /opt/mcb/web/lib/sqoop_table_lib.jar;
参数说明:
- table:导出的 hive 源表表名。
- fields-terminated-by:字段分隔符,默认为“\001”。
- input-null-string:替换字符串类型为空的列。
- input-null-non-string:替换非字符串类型为空的列。