关于Sqoop将oracle导入到hive中的时候出现的 No more data read from socket,或者拉取速度很慢的问题

一般情况下我们写sqoop是这样的:

sqoop import --connect jdbc:oracle:thin:@host:port:SID --username uname --password pwd --table abc.market_price --target-dir /ert/etldev/etl/market_price -m 1

 

我在使用的过程中发现,这种写法对于mysql和sqlserver是没有问题了,数据是能够抽取过来,并且速度很不错,但是当抽取oracle数据的时候会很慢甚至压根就抽取不过来,直接中断,出现No more data read from socket等错误.

 

解决方案:将 -m 1  替换成  --direct   即可,,具体原理暂时还不知道,后续了解之后会补充上来

sqoop import --connect jdbc:oracle:thin:@host:port:SID --username uname --password pwd --table abc.market_price --target-dir /ert/etldev/etl/market_price --direct 

 

sqoop默认使用的是JDBC的方式连接数据库并获取数据.

当加上了--direct   参数之后,变成了直连的方式了.

直接模式委托不是使用 JDBC 接口来传输数据, 而是将数据传输到数据库供应商提供的本机实用程序。以Mysql为例,
mysqldump和mysqlimport被用于从获取数据或会写数据。对于postgresql,sqoop利用pg_dump的优势来导入数据。使用本地应用工具能够
显著的提高性能,因为它们被优化以提供最佳的传输速度,同时减轻数据库服务器的负担。但有几个限制, 来使用此快速导入,第一:并不是
所有数据库都用可用的本地工具;对于直连这种模式并不是对所有的数据库都有效,目前sqoop只支持对mysql好postgresql的直连.

因为所有数据传输操作都是在生成的 MapReduce 作业内执行的,而且由于数据传输在直连工具的应用程序作用下会延迟数据传输,所以需要
确保所使用的本地应用程序在Hadoop TaskTracker节点上有效,举例来说:在使用Mysql时,在每个TaskTracker服务器上需要同时安装mysqlimport和
mysqldump

直接模式的另一个限制是不支持所有参数,作为该本机实用程序通常产生文本输出, 二进制格式如 SequenceFile 或 Avro将无法工作。
此外, 在以下几种情况下: 自定义转义字符、类型映射、列和行分隔符或 NULL 替换字符串的参数都可能无法被支持。

而且   --hive-drop-import-delims  参数也将不支持.

同时并不是所有的数据库都支持直连,所以还是谨慎使用.

 

另外:--direct速度确实快,但是把我的主键id搞没了,搞成null、NULL,,导致出现了几条脏数据.

如果你的数据中不包含\n  \t   \001等字符的话,使用--direct(如果数据库开通该功能的话),应该没问题.


下面说下我的这个原因吧.

首先我连接的全部是远程的数据库,因为对方限制了IP的端口的访问,也就是说虽然我JDBC能够连接并查询数据(那是因为我刚好在那台开放IP的机器上查询的),但是对于sqoop拉取数据而言就不行了,因为sqoop将数据拉取到hdfs上,  而大数据整个集群涉及多台机器,是因为没有将另外几台机器的IP开放,所以当mr运行的时候,,自然就获取不到数据了.

 

解决方案就是让对方对该IP组不限制或者直接不限制IP.

另外,我将ojdbc6.jar换成了ojdbc14.jar

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值