Sqoop基础知识(个人总结)

    声明: 1. 本文为我的个人复习总结, 并那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
              2. 由于是个人总结, 所以用最精简的话语来写文章
              3. 若有错误不当之处, 请指出

Sqoop是关系型数据库Hadoop大数据平台间的导入导出工具

底层是4个MapTask

导入数据:

  1. 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”

  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仓库

  1. 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间, 有的成功了有的失败了, 不满足原子性

解决办法:

  1. 设置map数量为1个(不推荐)

  2. 加参数

​ --staging-table user

​ --clear-staging-table

Sqoop在导入数据的时候数据倾斜

  1. split-by: 指明按哪个字段作为参考来分割任务, 来切分表的工作单元;

    ​ 那个**$CONDITIONS** 就是根据数据范围划分任务的;

    ​ 它们两个要结合使用

  2. 通过rownum( ) over( ) as lineNum, 结合split-by lineNum

  3. 把热点key 拼接固定区间内的随机值变得打乱

  4. num-mappers: 并行执行N个MapTask

上一篇:Sqoop实现mysql与hive数据表互相导入


下一篇:Sqoop-1.4.7安装以及使用