一般情况下我们写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