1.sqoop导出hadoop数据到mysql
前提: 将数据从Hadoop生态体系导出到RDBMS数据库导出前,目标表必须存在于目标数据库中。
export有三种模式:
1.1 默认操作是从将文件中的数据使用INSERT语句插入到表中。
- 观察要导入的hdfs数据
我们可以看到分隔符为SOH,对应编码表就是’\001’
- 在mysql的user库中创建目标表
use `user`
CREATE TABLE `user_info` (
`uid` int(10) NOT NULL,
`sex` varchar(2) NOT NULL,
`career` varchar(3) NOT NULL,
`education` varchar(3) NOT NULL,
`marriage` varchar(2) NOT NULL,
`usertype` varchar(3) NOT NULL,
`birthday` varchar(10) NOT NULL,
`province` varchar(3) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 执行导入命令
注意: 默认是逗号作为切割符
bin/sqoop export \
--connect jdbc:mysql://node03:3306/user \
--username root \
--password 123456 \
--table user_info \
--input-fields-terminated-by '\001' \
--export-dir /user/hive/warehouse/test.db/user_info/*
- 相关配置参数
--input-fields-terminated-by '\t'
指定文件中的分隔符
--columns
选择列并控制它们的排序。当导出数据文件和目标表字段列顺序完全一致的时候可以不写。否则以逗号为间隔选择和排列各个列。没有被包含在–columns后面列名或字段要么具备默认值,要么就允许插入空值。否则数据库会拒绝接受sqoop导出的数据,导致Sqoop作业失败
--export-dir
导出目录,在执行导出的时候,必须指定这个参数,同时需要具备--table或--call参数两者之一,--table是指的导出数据库当中对应的表,
--call
是指的某个存储过程。
--input-null-string --input-null-non-string
在进行导入的时候, 如果RDBMS的表中有null的数据, 在导入的hdfs后,
如果是字符串类型字段的: null转换为 "null"
如果是数字类型的字段的: null 转换为 空值
在进行导出的时候, 如果--input-null-string 会将 字符串 "null" 转换到 RDNMS中 空值
如果 --input-null-non-string 会将 空值 转换为 空值
解决方案: 在表数据中有空值情况下使用
--input-null-string "\\N" --input-null-non-string "\\N"
1.2 更新模式:Sqoop将生成UPDATE替换数据库中现有记录的语句。
bin/sqoop export \
--connect jdbc:mysql://node01:3306/user \
--username root \
--password 123456 \
--table user_info \
--export-dir /user/hive/warehouse/test.db/user_info/* \
--update-key id \
--update-mode updateonly
常见属性:
--update-key : 更新标识,即根据某个字段进行更新
--updatemod : 更新的模式
取值:
updateonly : 只管更新, 不管新增
allowinsert: 有更新执行更新, 有新增执行新增
注意 :
只会将修改的数据进行, 对于新增数据,不做任何操作
只管更新, 不管新增
1.3 调用模式:Sqoop将为每条记录创建一个存储过程调用。
bin/sqoop export \
--connect jdbc:mysql://node01:3306/user \
--username root \
--password 123456 \
--table user_info \
--export-dir /user/hive/warehouse/test.db/user_info/* \
--update-key id \
--update-mode allowinsert
2.Sqoop的job任务
- 以下是将mysql的test数据库导入hive中的作业。
bin/sqoop job --create testjob --import-all-tables \
--connect jdbc:mysql://node03:3306/test \
--hive-overwrite \
--username root \
--password 123456 \
--hive-import \
--hive-database test;
- 验证job
bin/sqoop job --list
- 检查job
bin/sqoop job --show testjob
- 执行job
bin/sqoop job --exec testjob
- 扩展一个免密执行job
#第一步在sqoop-site.xml中配置:
<property>
<name>sqoop.metastore.client.record.password</name>
<value>true</value>
<description>If true, allow saved passwords in the metastore.</description>
</property>
#第二步将sqoop规定的密码文件放在HDFS上,且文件权限必须是400
#第三步编写sqoop作业使用--password-file参数,如果是--password会出现警告