利用SQOOP将ORACLE到HDFS
#Oracle的连接字符串,其中包含了URL,SID,和PORT
URL=jdbc:oracle:thin:@132.232.19.79:10521:szdw
#使用的用户名
USERNAME=szdw
#使用的密码
PASSWORD=szdw
#需要从Oracle中导入的表名
TableNAME=proc_resource_admin
#需要从Oracle中导入的表中的字段名
COLUMNS=AREA_ID,TEAM_NAME
#将Oracle中的数据导入到HDFS后的存放路径
HADFPATH=/home/hadoop/data/proc_resource_admin
#执行导入逻辑。将Oracle中的数据导入到HDFS中
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HAFSPATH --num-mappers 1 --table $TABLENAME --COLUMNS $columns --fields-terminated-by '\t';
执行这个脚本之后,导入程序就完成了。
接下来,用户可以自己创建外部表,将外部表的路径和HDFS中存放Oracle数据的路径对应上即可。
注意:这个程序导入到HDFS中的数据是文本格式,所以在创建Hive外部表的时候,不需要指定文件的格式为RCFile,而使用默认的TextFile即可。数据间的分隔符为'\t'。如果多次导入同一个表中的数据,数据以append的形式插入到HDFS目录中。
并行导入
假设有这样这个sqoop命令,需要将Oracle中的数据导入到HDFS中:
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH --m 1 --table $TABLENAME --columns $columns --fields-terminated-by '\t' --where "data_desc='2011-02-26'";
请注意,在这个命令中,有一个参数“-m”,代表的含义是使用多少个并行,这个参数的值是1,说明没有开启并行功能。
现在,我们可以将“-m”参数的值调大,使用并行导入的功能,如下面这个命令:
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH --m 4 --table $TABLENAME --columns $columns --fields-terminated-by '\t' --where "data_desc='2011-02-26'";
一般来说,Sqoop就会开启4个进程,同时进行数据的导入操作。
但是,如果从Oracle中导入的表没有主键,那么会出现如下的错误提示:
ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'.
在这种情况下,为了更好的使用Sqoop的并行导入功能,我们就需要从原理上理解Sqoop并行导入的实现机制。
如果需要并行导入的Oracle表的主键是id,并行的数量是4,那么Sqoop首先会执行如下一个查询:
select max(id) as max, select min(id) as min from table [where 如果指定了where子句];
通过这个查询,获取到需要拆分字段(id)的最大值和最小值,假设分别是1和1000。
然后,Sqoop会根据需要并行导入的数量,进行拆分查询,比如上面的这个例子,并行导入将拆分为如下4条SQL同时执行:
select * from table where 0 <= id < 250;
select * from table where 250 <= id < 500;
select * from table where 500 <= id < 750;
select * from table where 750 <= id < 1000;
注意,这个拆分的字段需要是整数。
从上面的例子可以看出,如果需要导入的表没有主键,我们应该如何手动选取一个合适的拆分字段,以及选择合适的并行数。
再举一个实际的例子来说明:
我们要从Oracle中导入creater_user.popt_cas_redirect_his。
这个表没有主键,所以我们需要手动选取一个合适的拆分字段。
首先看看这个表都有哪些字段:
然后,我假设ds_name字段是一个可以选取的拆分字段,然后执行下面的sql去验证我的想法:
select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'
发现结果不理想,min和max的值都是相等的。所以这个字段不合适作为拆分字段。
再测试一下另一个字段:CLIENTIP
select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc='2011-02-26'
这个结果还是不错的。所以我们使用CLIENTIP字段作为拆分字段。
所以,我们使用如下命令并行导入:
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH --m 12 --split-by CLIENTIP --table $TABLENAME --columns $columns --fields-terminated-by '\t' --where "data_desc='2011-02-26'";
这次执行这个命令,可以看到,消耗的时间为:20mins, 35sec,导入了33,222,896条数据。
另外,如果觉得这种拆分不能很好满足我们的需求,可以同时执行多个Sqoop命令,然后在where的参数后面指定拆分的规则。如:
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t' --where "data_desc='2011-02-26' logtime<10:00:00"
sqoop import --append --connect $URL --username $USERNAME --password $PASSWORD --target-dir $HDFSPATH --m 1 --table $oTABLENAME --columns $columns --fields-terminated-by '\t' --where "data_desc='2011-02-26' logtime>=10:00:00"
从而达到并行导入的目的。
利用SQOOP将ORACLE到HDFS的更多相关文章
- sqoop将oracle数据导入hdfs集群
使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...
- 通过Sqoop实现Mysql / Oracle 与HDFS / Hbase互导数据
通过Sqoop实现Mysql / Oracle 与HDFS / Hbase互导数据\ 下文将重点说明通过Sqoop实现Mysql与HDFS互导数据,Mysql与Hbase,Oracle与Hbase的互 ...
- 详解大数据采集引擎之Sqoop&采集oracle数据库中的数据
一.Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop i ...
- [Sqoop]利用sqoop对mysql运行DML操作
业务背景 利用sqoop对mysql进行查询.加入.删除等操作. 业务实现 select操作: sqoop eval \ --connect jdbc:mysql://127.0.0.1:3306/m ...
- 利用sqoop对mysql执行DML操作
业务背景 利用Sqoop对MySQL进行查询.添加.删除等操作. 业务实现 select操作: sqoop eval \ --connect jdbc:mysql://127.0.0.1:3306/m ...
- 利用sqoop将hive数据导入导出数据到mysql
一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306 ...
- sqoop 从oracle导数据到hive中,date型数据时分秒截断问题
oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案 1.问题描述: 用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了 ...
- 利用Sqoop将MySQL海量测试数据导入HDFS和HBase
声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.安装Sqoop 1.下载sqoop,解压.文件夹重命名 wget http://mirror.bit.edu.cn/apache/sqoop/1 ...
- 使用sqoop从Oracle或mysql抽取数据到HDFS遇到的报错及解决
一.参考文档: 1.https://www.rittmanmead.com/blog/2014/03/using-sqoop-for-loading-oracle-data-into-hadoop-o ...
随机推荐
- 嵌入式开发之NorFlash 和NandFlash
http://blog.csdn.net/tigerjibo/article/details/9322035 [摘要]:作为一个嵌入式工程师,要对NorFlash 和NandFlash要有最起码的认知 ...
- boost在linux下的编译和使用
上一篇boost在windows可以正常的使用了,但是在linux下不行. [尝试一:使用和windows同一套代码编译,编译时报错] 我是在Ubuntu使用共享文件夹的方式和windows使用的同一 ...
- 区分jquery中的offset和position
一次又一次地碰到需要获取元素位置的问题, 然后一次又一次地查offset和position的区别. 忍不了了, 这次一定得想办法记下来. position是元素相对于父元素的位置. 这个好记, par ...
- 50个非常有用的PHP工具
PHP是使用最为广泛的开源服务器端脚本语言之一,当然PHP并不是速度最快的,但它却是最常用的脚本语言.这里有50个有益的PHP工具,可以大大提高你的编程工作: 调试工具 Webgrind Xdebug ...
- 排查Java线上服务故障的方法和实例分析
前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时候的情景是: (1)你可能对这个业务仅仅是听说过,而不怎么真正了解: (2 ...
- VPN column: PPTP(2)--PPTP协议解析
zhu_hit原创,如需转载请注明出处.Thanks. PPTP协议大体上可以分为两部分:控制层连接和隧道,下面简要介绍两部分的功能.如果要详细了解PPTP协议请阅读RFC文档. 一. Control ...
- WinCE下VPN设置
一.环境 1. WinCE5.0+2004/2005/2006/2007补丁. 2. 3G拨号模块. 二.说明 1. WinCE设备必须可以接入网络. 2. 支 ...
- 【POJ】2104 K-th Number
区间第K大数.主席树可解. /* 2104 */ #include <iostream> #include <sstream> #include <string> ...
- 将非WPF window设为 WPF Window的Owner
如果WPF Content是寄宿在Win32 窗体或Windows Form中,则在WPF模块中可能不会存在WPF Window(WPF模块的根可能是个UserControl).如果在WPF模块中弹出 ...
- jQgrid问题总结
最近一段时间一直在使用jqgrid这个免费的插件,网上的资料也比较多.比较全,但是这里还是整理几个自己在开发过程中遇到的小问题. 1.自动换行 一行数据过多需要自动根据内容换行时,如果遇到在表格中的汉 ...