sqoop工具是hadoop环境下连接关系数据库和hadoop存储系统的桥梁,支持多种关系数据源和hive,hbase表格的相互导入。
一般情况下,关系数据表存在于线上环境的备份环境,需要每天进行数据导入。如果数据表较大,我们通常不可能每次都进行全表的导入。幸运的是,sqoop提供了增量导入数据的机制。下面就以mysql数据表为例,看一个例子。
假设在本地假设了Mysql服务器,我们需要每天从main数据库中导入visit_log表,表结构是 id, url, time。
首先指定sqoop中源参数:
--connect jdbc:mysql://localhost:3306/main
--username root
--password pass
--table user
--columns "id,url,time"
--direct
我们需要将数据表导入hive中,所以在hive中建立新表
create table hive_visit_log ( id int, url string, time string);
然后指定sqoop中关于目标数据源的参数:
--hive-import
--hive-table hive_visit_log
最后指定增量的参数:
--incremental append
--check-column id
--last-value 0
这样,sqoop会从visit_log中id比0大的id开始导入,实现了增量导入。可以采用非增量导入,但是sqoop似乎会在warehouse-dir目录下建立一个源表名的目录,如果有此目录存在会报错,所以建议采用增量导入。
* 如果导入时候需要采用分区,可以用--where控制条件配合--hive-partition-key dt --hive-partition-value '2011-03-21' 参数
还有一个问题,每天导入时候的last value值不一样,如何做到每天动态的读取新的last value呢?这点sqoop也想到了,在技术指南中,sqoop支持把一条sqoop命令变为一个job,sqoop会通过job结果自动的更换last value的值。将sqoop命令建立为job的命令很简单,在原来命令基础上将import 替换为job <job_name> --create -- import就可以命名一个job_name的任务。执行任务是直接用 sqoop job --exec <job_name>
最后我们得到的sqoop命令是:
sqoop job visit_import --create -- import --connect jdbc:mysql://localhost:3306/main --username root --password pass --table user --columns "id,url,time" --direct --hive-import --hive-table hive_visit_log --incremental append --check-column id --last-value 0
sqoop job --exec visit_import
参考:Sqoop User Guide (v1.3.0-cdh3u6)
转自:http://blog.csdn.net/awayyao/article/details/7635094