简介
apache开源提供的一个数据导入导出的工具,从关系型数据库导入到hdfs,或者从hdfs导出到关系型数据库等等
从关系型数据库到hdfs 叫做导入
从hdfs到关系型数据库 叫做导出
通过MR的inputformat和outputformat来实现数据的输入与输出,底层执行的全部都是MR的任务,只不过这个mr只有map阶段,没有reduce阶段
说白了只是对数据进行抽取,从一个地方,抽取到另外一个地方
架构
sqoop 1.x 不用安装,解压就能用
sqoop 2.x 架构发生了变化,引入了一个服务端 可以通过代码提交sqoop的任务
一般用sqoop1.x比较多,直接将我们的命令写入到脚本里面去,执行脚本即可
sqoop常用操作
数据导入
bin/sqoop import --connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 --table emp --m 1
bin/sqoop import --connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp --m 1
bin/sqoop import --connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp --m 1 --fields-terminated-by '\001'
bin/sqoop import --connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 --table emp1 --target-dir /sqoop/emp --m 1 --fields-terminated-by '\001' --hive-import --hive-table sqooptohive.emp_hive
bin/sqoop import --connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 --table emp --target-dir /sqoop/emp5 --m 1 --fields-terminated-by '\001' --hive-import --hive-database sqooptohive
bin/sqoop import\
--connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456\
--table emp --target-dir /sqoop/emp_where --m 1 --fields-terminated-by '\001'\
--hive-import --hive-database sqooptohive --where "salary>4000"
bin/sqoop import \
--connect jdbc:mysql://192.168.29.130:3306/userdb --username root -password 123456 \
--target-dir /sqoop/emp_sql --m 1 \
--query 'select phno from emp_conn where 1=1 and $CONDITIONS' \
如何解决导入增量的问题
每个数据都会有一个创建时间,可以根据我们的创建时间来判断是否是我们前一天的数据
如何解决导入减量数据的问题???
什么是减量数据????删除掉的数据 数据不是做真删除
做假删除,其实就是改变了一些数据的状态,数据的更细时间,同步改变
所有的减量数据都转化为变更数据来处理
使用--where来实现增量的导入
bin/sqoop import \
--connect jdbc:mysql://192.168.163.30:3306/userdb \
--username root \
--password admin \
--table emp \
--incremental append \
--where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59' " \
--target-dir /sqoop/incement2 \
--check-column id \
--m 1
数据导出
sqoop的数据的导出:
导出:从hdfs到关系型数据库
bin/sqoop export \
--connect jdbc:mysql://192.168.163.30:3306/userdb \
--username root --password admin \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","
导出数据的时候,如果导出到一半,报错了怎么办????
一般都是创建mysql的临时表 如果临时表导入成功,再往目的表里面导入
扩展
sqoop导入导出是一个离线处理的工具
底层使用的都是MR的程序
有没有什么工具,可以实现实时的抽取数据
canal 通过解析binlog可以实现实时的数据抽取
flume 自定义source 代码在github上面 也可以实现近似实时的数据抽取
streamSet 比较强大,可以实现实时的抽取数据
下去调研了解以上三个工具实现实时的抽取