Sqoop
什么是Sqoop
它是将关系数据库(oracle、mysql、postgresql等)数hadoop数据进行转换的工具。
版本:(两个版本完全不兼容,sqoop1使用最多)
sqoop1:1.4.x
sqoop2:1.99.x版本
同类产品–DataX:阿里顶级数据交换工具
sqoop1架构
sqoop1由client端直接接入hadoop,任务通过解析生成对应的maprecue执行。
安装
- 解压安装包
- 配置环境变量
export SQOOP_HOME=/XX/sqoop.xx
source /etc/profile - 添加数据库驱动包
cp mysql-connector-java-5.1.10.jar /sqoop-install-path/lib - 重命名配置文件
mv sqoop-env-template.sh sqoop-env.sh - 修改$SQOOP_HOME/bin/configure-sqoop
注释掉HCatalog,Accumulo检查(除非你准备使用HCatalog,Accumulo等HADOOP上的组件)
## Moved to be a runtime check in sqoop. #if [ ! -d "${HCAT_HOME}" ]; then # echo "Warning: $HCAT_HOME does not exist! HCatalog jobs willfail." # echo 'Please set $HCAT_HOME to the root of your HCatalog installation.' #fi #if [ ! -d "${ACCUMULO_HOME}" ];then # echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports willfail.“# echo 'Please set $ACCUMULO_HOME to the root of your
Accumuloinstallation.’
#fi
- 测试 sqoop version
- sqoop list–databases -connect jdbc:mysql://node03:3306/ -username root -password 123
- sqoop list-tables --connect jdbc:mysql://192.168.235.18:3306/mysql --username root --password 123
导入/导出工具
http://blog.sina.com.cn/s/blog_13088c10a0102wv4i.html
- 导入工具import:
选项 含义说明含义说明
--append 将数据追加到HDFS上一个已存在的数据集上 --as-avrodatafile 将数据导入到Avro数据文件 --as-sequencefile 将数据导入到SequenceFile --as-textfile 将数据导入到普通文本文件(默认) --boundary-query <statement> 边界查询,用于创建分片(InputSplit) --columns <col,col,col…> 从表中导出指定的一组列的数据 --delete-target-dir 如果指定目录存在,则先删除掉 --direct 使用直接导入模式(优化导入速度) --direct-split-size <n> 分割输入stream的字节大小(在直接导入模式下) --fetch-size <n> 从数据库中批量读取记录数 --inline-lob-limit <n> 设置内联的LOB对象的大小 -m,--num-mappers <n> 使用n个map任务并行导入数据 -e,--query <statement> 导入的查询语句 --split-by <column-name> 指定按照哪个列去分割数据 --table <table-name> 导入的源表表名 --target-dir <dir> 导入HDFS的目标路径 --warehouse-dir <dir> HDFS存放表的根路径 --where <where clause> 指定导出时所使用的查询条件 -z,--compress 启用压缩 --compression-codec <c> 指定Hadoop的codec方式(默认gzip) --null-string <null-string> 如果指定列为字符串类型,使用指定字符串替换值为null的该类列的值 --null-non-string <null-string>如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值 --validate <class-name> 启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现类 --validation-threshold <class-name> 指定验证门限所使用的类 --direct 使用直接导出模式(优化速度)
- 导出工具export
--export-dir <dir> 导出过程中HDFS源路径 --m,--num-mappers <n> 使用n个map任务并行导出 --table <table-name> 导出的目的表名称 --call <stored-proc-name> 导出数据调用的指定存储过程名 --update-key <col-name> 更新参考的列名称,多个列名使用逗号分隔 --update-mode <mode> 指定更新策略,包括:updateonly(默认)、allowinsert --input-null-string <null-string> 使用指定字符串,替换字符串类型值为null的列 --input-null-non-string <null-string> 使用指定字符串,替换非字符串类型值为null的列 --staging-table <staging-table-name> 在数据导出到数据库之前,数据临时存放的表名称 --clear-staging-table 清除工作区中临时存放的数据 --batch 使用批量模式导出
导入导出操作
http://blog.sina.com.cn/s/blog_13088c10a0102wv4i.html
将MySQL中的数据导入到HDFS/Hive/Hbase
- 将MySQL中的数据导入到HDFS
sqoop import --connect jdbc:mysql://node03:3306/test --username root
–password 123 --table myuser -m1 -target-dir hdfs://shsxt/my02
- 将MySQL中的数据导入到到Hive:
sqoop import --connect jdbc:mysql://node03:306/test --username root
–password root --table testa --hive-import -m 1
由于使用Sqoop从MySQL导入数据到Hive需要指定target-dir,因此导入的是普通表而不能为外部表。
3. 将MySQL中的数据导入到到HBase:
sqoop import --connect jdbc:mysql://node04:3306/test --username root
–password 123 --table mysqoop --hbase-table jackie --column-family cf1 --hbase-row-key name --hbase-create-table -m 1
使用Sqoop将HDFS/Hive/HBase中的数据导出到MySQL
- 将HDFS中的数据导出到MySQL
sqoop export --connect jdbc:mysql://192.168.235.18:3306/test
–username root --password 123 --table my --export-dir /root/my
- 将Hive的数据导出到MySQL
sqoop export --connect jdbc:mysql://10.233.45.104:3306/test --username
root --password root --table testa --export-dir
/user/hive/warehouse/testa --input-fields-terminated-by '\001’
- 将HBase中的数据导出到MySQL
目前sqoop没有办法把数据直接从Hbase导出到mysql。也可以通过Hive建立2个表,一个外部表是基于这个Hbase表的,另一个是单纯的基于hdfs的hive原生表,然后把外部表的数据导入到原生表(临时),然后通过hive将临时表里面的数据导出到mysql
sqoop export --connect jdbc:mysql://172.50.4.148:3306/mysql --username
root --password 123456 --table bb --export-dir
‘/mysql_data/part-m-00000’
Sqoop增量导入
sqoop import -D sqoop.hbase.add.row.key=true --connect jdbc:mysql://192.168.1.9:3306/spider --username root --password root --table TEST_GOODS --columns ID,GOODS_NAME,GOODS_PRICE --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key ID --incremental lastmodified --check-column U_DATE --last-value '2017-06-27' --split-by U_DATE --incremental lastmodified 增量导入支持两种模式 append 递增的列;lastmodified时间戳。 --check-column 增量导入时参考的列 --last-value 最小值,这个例子中表示导入2017-06-27到今天的值
Sqoop job定时任务
sqoop job --create testjob01 --import --connect jdbc:mysql://192.168.1.9:3306/spider --username root --password root --table TEST_GOODS --columns ID,GOODS_NAME,GOODS_PRICE --hbase-create-table --hbase-table t_goods --column-family cf --hbase-row-key ID -m 1 设置定时执行以上sqoop job 使用linux定时器:crontab -e 例如每天执行 0 0 * * * /opt/local/sqoop-1.4.6/bin/sqoop job …. --exec testjob01