【甘道夫】Sqoop原生增量导入特性探秘

标签: 甘道夫 sqoop | 发表时间:2014-08-28 02:33 | 作者:u010967382
出处:http://blog.csdn.net
原始思路
要想实现增量导入,完全可以不使用Sqoop的原生增量特性,仅使用shell脚本生成一个以当前时间为基准的固定时间范围,然后拼接Sqoop命令语句即可。

原生增量导入特性简介
Sqoop提供了原生增量导入的特性,包含以下三个关键参数:
Argument Description
--check-column (col) 指定一个“标志列”用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型(这个很好理解吧)。
--incremental (mode) 指定增量模式,包含“追加模式”  append 和“最后修改模式”  lastmodified (该模式更满足常见需求)。
--last-value (value) 指定“标志列”上次导入的上界。如果“标志列”是最后修改时间,则--last-value为上次执行导入脚本的时间。

结合Saved Jobs机制,可以实现重复调度增量更新Job时 --last-value 字段的自动更新赋值,再结合cron或者oozie的定时调度,可实现真正意义的增量更新。

实验:增量job的创建和执行   
创建增量更新job:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ sqoop job --create incretest -- import --connect jdbc:oracle:thin:@192.168.0.138:1521:orcl  --username HIVE --password hivefbi --table FBI_SQOOPTEST --hive-import --hive-table INCRETEST  --incremental lastmodified --check-column LASTMODIFIED --last-value '2014/8/27 13:00:00'
14/08/27 17:29:37 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
14/08/27 17:29:37 INFO tool.BaseSqoopTool: Using Hive-specific delimiters for output. You can override
14/08/27 17:29:37 INFO tool.BaseSqoopTool: delimiters with --fields-terminated-by, etc.
14/08/27 17:29:37 WARN tool.BaseSqoopTool: It seems that you've specified at least one of following:
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-home
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-overwrite
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --create-hive-table
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-table
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-partition-key
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --hive-partition-value
14/08/27 17:29:37 WARN tool.BaseSqoopTool:      --map-column-hive
14/08/27 17:29:37 WARN tool.BaseSqoopTool: Without specifying parameter --hive-import. Please note that
14/08/27 17:29:37 WARN tool.BaseSqoopTool: those arguments will not be used in this session. Either
14/08/27 17:29:37 WARN tool.BaseSqoopTool: specify --hive-import to apply them correctly or remove them
14/08/27 17:29:37 WARN tool.BaseSqoopTool: from command line to remove this warning.
14/08/27 17:29:37 INFO tool.BaseSqoopTool: Please note that --hive-home, --hive-partition-key,
14/08/27 17:29:37 INFO tool.BaseSqoopTool:       hive-partition-value and --map-column-hive options are
14/08/27 17:29:37 INFO tool.BaseSqoopTool:       are also valid for HCatalog imports and exports

执行Job:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ ./sqoop job --exec incretest

注意日志中显示的SQL语句:
14/08/27 17:36:23 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(ID), MAX(ID) FROM FBI_SQOOPTEST WHERE ( LASTMODIFIED >= TO_DATE(' 2014/8/27 13:00:00', 'YYYY-MM-DD HH24:MI:SS') AND LASTMODIFIED < TO_DATE(' 2014-08-27 17:36:23', 'YYYY-MM-DD HH24:MI:SS') )
其中, LASTMODIFIED的下界是创建job的语句中指定的,上界是 当前时间 2014-08-27 17:36:23

验证:
hive> select * from incretest;
OK
2       lion    2014-08-27
Time taken: 0.085 seconds, Fetched: 1 row(s)

然后我向Oracle中插入一条数据:
 

再执行一次:
fulong@FBI006:~/Sqoop/sqoop-1.4.4/bin$ ./sqoop job --exec incretest

日志中显示的SQL语句:  
14/08/27 17:47:19 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(ID), MAX(ID) FROM FBI_SQOOPTEST WHERE ( LASTMODIFIED >= TO_DATE(' 2014-08-27 17:36:23', 'YYYY-MM-DD HH24:MI:SS') AND LASTMODIFIED < TO_DATE(' 2014-08-27 17:47:19', 'YYYY-MM-DD HH24:MI:SS') )
其中,LASTMODIFIED的下界是上一次执行该job的上界,也就是说,Sqoop的“Saved Jobs”机制对于增量导入类Job,自动记录了上一次的执行时间,并自动将该时间赋值给下一次执行的--last-value参数!也就是说,我们只需要通过crontab设定定期执行该job即可,job中的--last-value将被“Saved Jobs”机制自动更新以实现真正意义的增量导入。

以上Oracle表中新增的数据被成功插入Hive表中。

再次向oracle表中新增一条数据,再次执行该job,情况依旧,日志中显示上一次的上界自动成为本次导入的下界:
14/08/27 17:59:34 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(ID), MAX(ID) FROM FBI_SQOOPTEST WHERE ( LASTMODIFIED >= TO_DATE('2014-08-27 17:47:19', 'YYYY-MM-DD HH24:MI:SS') AND LASTMODIFIED < TO_DATE('2014-08-27 17:59:34', 'YYYY-MM-DD HH24:MI:SS') )

作者:u010967382 发表于2014-8-27 18:33:44 原文链接
阅读:66 评论:0 查看评论

相关 [甘道夫 sqoop] 推荐:

【甘道夫】Sqoop原生增量导入特性探秘

- - CSDN博客云计算推荐文章
原始思路 要想实现增量导入,完全可以不使用Sqoop的原生增量特性,仅使用shell脚本生成一个以当前时间为基准的固定时间范围,然后拼接Sqoop命令语句即可. Sqoop提供了原生增量导入的特性,包含以下三个关键参数:. 指定一个“标志列”用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型(这个很好理解吧).

sqoop 使用心得

- - 经验沉淀 知识结晶
本文原创,转载请说明出处:http://ronxin999.blog.163.com/blog/static/42217920201348103424245/. sqoop是干吗的,就不在这里浪费笔墨了,这里主要讲下一个新手接触到sqoop碰到的问题. 一  业务场景 Hive 查询Hql的结果进入MySql,目前本人是通过两步来实现的,.

sqoop 常用写法

- - 开源软件 - ITeye博客
2 查看具体数据库内的表. 3  将关系型数据表结构users复制到Hive默认库的表users中:. 参数说明:  这两个参数可以不加. --fields-terminated-by "\0001"  是设置每列之间的分隔符,"\0001"是ASCII码中的1,. 它也是hive的默认行内分隔符, 而sqoop的默认行内分隔符为"," .

Sqoop介绍及使用

- - CSDN博客云计算推荐文章
Apache Sqoop是用来实现结构型数据(如关系数据库)和Hadoop之间进行数据迁移的工具. 它充分利用了MapReduce的并行特点以批处理的方式加快数据的传输,同时也借助MapReduce实现了容错. 项目地址: http://sqoop.apache.org/. 目前为止,已经演化出了2个版本:sqoop1和sqoop2.

Sqoop成为Apache顶级项目

- - NoSQLFan
Sqoop是一个Hadoop的周边工具,它的主要作用是在结构化数据存储与Hadoop之间进行数据交换,通过 Sqoop,你可以批量将你关系型数据库中的数据导入到Hadoop中,也可以将Hadoop中的数据导出到其它结构化存储中. Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目.

Hive部署(包括集成Hbase和Sqoop)

- - ITeye博客
Hive部署(包括集成Hbase和Sqoop) .     主要是选择软件版本. 将解压后的hive-0.8.1文件放在系统的/home/hadoop/hive/中. 4.1 设置HADOOP_HOME. 修改hive-0.8.1目录下/conf/hive-env.sh.template中的HADOOP_HOME为实际的Hadoop安装目录.

Apache Sqoop 1.4.3 发布,Hadoop 数据迁移

- - 开源中国社区最新新闻
Sqoop是一个用来将 Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中. Sqoop 1.4.3 完整的改进记录请看 这里. 下载地址: http://www.apache.org/dyn/closer.cgi/sqoop/.

Sqoop导入关系数据库到Hive

- - 开源软件 - ITeye博客
文章来自:http://blog.javachen.com/2014/08/04/import-data-to-hive-with-sqoop/. Sqoop 是 apache 下用于 RDBMS 和 HDFS 互相导数据的工具. 本文以 mysql 数据库为例,实现关系数据库导入到 hdfs 和 hive.

【甘道夫】Mahout推荐算法编程实践

- - CSDN博客云计算推荐文章
Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现. 下文介绍基于Taste实现最常用的UserCF和ItemCF. 本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现. UserCF和ItemCF算法的输入数据是用户偏好,用户偏好数据可以有两种形式:.

用sqoop进行mysql和hdfs系统间的数据互导

- - CSDN博客云计算推荐文章
sqoop 是apache下用于RDBMS和HDFS互相导数据的工具. 本文档是sqoop的使用实例,实现从mysql到hdfs互导数据,以及从Mysql导数据到HBase. 一、从HBase库中直接导出到mysql中. 一开始我想从HBase库中直接导出到mysql中. 在mysql中创建一个库和表.