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:替换非字符串类型为空的列。

 

posted @ 2021-05-29 20:36  Juno3550  阅读(163)  评论(0编辑  收藏  举报