1.sqoop介绍
Apache Sqoop是在Hadoop生态体系和RDBMS体系之间传送数据的一种工具。来自于Apache软件基金会提供。
Sqoop工作机制是将导入或导出命令翻译成mapreduce程序来实现。在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
Hadoop生态系统包括:HDFS、Hive、Hbase等
RDBMS体系包括:Mysql、Oracle、DB2等
Sqoop可以理解为:“SQL 到 Hadoop 和 Hadoop 到SQL”。
2.sqoop入门知识总结
- sqoop 安装验证
bin/sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root --password hadoop
注意事项:命令携带参数必须出现在一行中,若换行就意味着自动提交执行,可通过\表示未结束。
- 全量导入数据到hdfs
- mysql的地址尽量不要使用localhost 请使用ip或者host
- 如果不指定 导入到hdfs默认分隔符是 “,”
- 可以通过-- fields-terminated-by '\ t‘ 指定具体的分隔符
- 如果表的数据比较大 可以并行启动多个maptask执行导入操作,如果表没有主键,请指定根据哪个字段进行切分
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /sqoopresult214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2
- 导入表数据子集(query查询)
使用 query sql 语句来进行查找不能加参数--table ;
并且必须要添加 where 条件;
并且 where 条件后面必须带一个$CONDITIONS 这个字符串;
并且这个 sql 语句必须用单引号,不能用双引号;
- 增量数据的导入
- 所谓的增量数据指的是上次至今中间新增加的数据
- sqoop支持两种模式的增量导入
- append追加 根据数值类型字段进行追加导入 大于指定的last-value
- lastmodified 根据时间戳类型字段进行追加 大于等于指定的last-value
- 注意在lastmodified 模式下 还分为两种情形:append merge-key
- 关于lastmodified 中的两种模式:
- append 只会追加增量数据到一个新的文件中 并且会产生数据的重复问题
因为默认是从指定的last-value 大于等于其值的数据开始导入 - merge-key 把增量的数据合并到一个文件中 处理追加增量数据之外 如果之前的数据有变化修改
也可以进行修改操作 底层相当于进行了一次完整的mr作业。数据不会重复。
- 数据导出操作
- 注意:导出的目标表需要自己手动提前创建 也就是sqoop并不会帮我们创建复制表结构
- 导出有三种模式:
- 默认模式 目标表是空表 底层把数据一条条insert进去
- 更新模式 底层是update语句
- 调用模式 调用存储过程
- 相关配置参数
- 导出文件的分隔符 如果不指定 默认以“,”去切割读取数据文件 --input-fields-terminated-by
- 如果文件的字段顺序和表中顺序不一致 需要–columns 指定 多个字段之间以","
- 导出的时候需要指定导出数据的目的 export-dir 和导出到目标的表名或者存储过程名
- 针对空字符串类型和非字符串类型的转换 “\n”
- 更新导出
- updateonly 只更新已经存在的数据 不会执行insert增加新的数据
- allowinsert 更新已有的数据 插入新的数据 底层相当于insert&update