声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
Sqoop是关系型数据库和Hadoop大数据平台间的导入导出工具
底层是4个MapTask
导入数据:
- RDBMS到HDFS
(1)全部导入
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
–table staff \
–target-dir /user/company \
–delete-target-dir \
–num-mappers 1 \
–fields-terminated-by “\t”
(2)查询导入
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
-target-dir /user/company \
–delete-target-dir \
–num-mappers 1 \
–fields-terminated-by “\t” \
–query 'select name,sex from staff where id <=1 and $CONDITIONS;
提示: must contain ‘$CONDITIONS’ in WHERE clause. 这是为了map拆分任务时能添加条件,若原本不想过滤可以写作 where 1=1 and $CONDITIONS;
如果query后使用的是双引号, 则$CONDITIONS前必须加转义符, 防止shell识别为自己的变量。
(3)导入指定列
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
–target-dir /user/company \
–delete-target-dir \
–num-mappers 1 \
–fields-terminated-by “\t” \
–columns id,sex \
–table staff
提示: columns中如果涉及到多列, 用逗号分隔, 分隔时不要添加空格
(4)使用sqoop关键字筛选查询导入数据
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
–target-dir /user/company \
–delete-target-dir \
–num-mappers 1 \
–fields-terminated-by “\t” \
–table staff \
-where “id=1”
- RDBMS到Hive
第一步 将数据导入到HDFS, 默认的临时目录是/user/用户名/表名
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
–table staff \
–num-mappers 1 \
–hive-import \
–fields-terminated-by “\t” \
–hive-overwrite \
–hive-table staff_hive
第二步 将导入到HDFS的数据迁移到Hive仓库
- RDBMS到HBase
得提前创建好表
bin/sqoop import \
–connect jdbc:mysql://hadoop101:3306/company \
–username root \
–password root12345 \
–table company \
–columns “id,name,sex” \
–column-family “info” \
–hbase-row-key “id” \
–hbase-table “hbase_company” \
–num-mappers 1 \
–split-by id
导出数据:
导出数据时,只能把HDFS文件导出, 其他导出不支持;
Hive/HBase导出实质也是HDFS导出,跟Hive/HBase没关系
由于是文件操作, 所以不支持选择部分字段和加过滤条件等, 相当于只能select * from table;
$ bin/sqoop export \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password root12345 \
--table user \
--num-mappers 1 \
--export-dir /user/hive/warehouse/user \
--input-fields-terminated-by "\t"
Sqoop导入导出Null存储一致性问题
Hive中的Null在底层是以“\N”来存储, 而MySQL中的Null在底层就是Null, 为了保证数据两端的匹配:
导出数据时采用 --input-null-string和–input-null-non-string两个参数
导入数据时采用 --null-string和–null-non-string两个参数
事务原子性问题:
多个MapTask间, 有的成功了有的失败了, 不满足原子性
解决办法:
-
设置map数量为1个(不推荐)
-
加参数
--staging-table user
--clear-staging-table
Sqoop在导入数据的时候数据倾斜
-
split-by: 指明按哪个字段作为参考来分割任务, 来切分表的工作单元;
那个**$CONDITIONS** 就是根据数据范围划分任务的;
它们两个要结合使用
-
通过rownum( ) over( ) as lineNum, 结合
split-by lineNum
-
把热点key 拼接固定区间内的随机值变得打乱
-
num-mappers: 并行执行N个MapTask