检测到 Sqoop 套接字超时:从大型机读取数据并插入 Hive 时读取超时
Posted
技术标签:
【中文标题】检测到 Sqoop 套接字超时:从大型机读取数据并插入 Hive 时读取超时【英文标题】:Sqoop Socket timeout detected: Read timed out while reading data from Mainframe and insert into Hive 【发布时间】:2020-04-15 00:01:28 【问题描述】:请找出我的以下问题并帮助我解决它。
我有一个 sqoop 语句,它使用 attunity jdbc 驱动程序将数据从大型机带到 Hadoop(Hive)。
sqoop import \
--connect "jdbc:attconnect://X.X.1.1:8883;DefTdpName=PROD_E;OneTdpMode=1"\
--driver "com.attunity.jdbc.NvDriver" \
--query Select * FROM how_record WHERE \$CONDITIONS" \
--fields-terminated-by "\t" \
--hive-import \
--hive-overwrite \
--delete-target-dir \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-delims-replacement '' \
--target-dir "path/how_record" \
--fetch-size 50000 \
--hive-table "how_record" -m 1
当我第一次在 sqoop 语句上运行时,我不断收到套接字超时错误。
ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: JBC0088E: JBC0002E: Socket timeout detected: Read timed out java.sql.SQLException: JBC0088E: JBC0002E: Socket timeout detected: Read timed out at com.attunity.jdbc.NvSQLWarning.createSQLException(Unknown Source) at com.attunity.comm.XmsgComm.xMsgThrowTimeoutEx(Unknown Source) at com.attunity.comm.XmsgComm.treatInterruptedIOException(Unknown Source) at com.attunity.comm.XmsgComm.xMsgPerformCall(Unknown Source) at com.attunity.comm.Daemon.GetServer(Unknown Source) at com.attunity.navapi.SysTdp.getRemoteSysTdp(Unknown Source) at com.attunity.jdbc.NvConnectionBase.open(Unknown Source) at com.attunity.jdbc.NvConnectPropertiesBase.openConnection(Unknown Source) at com.attunity.jdbc.NvDriverCoreBase.connect(Unknown Source) at com.attunity.jdbc.NvDriverCoreBase.connect(Unknown Source) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:270)
但是当我第二次(立即)在上面运行时,错误会自动解决并且 sqoop 正在成功完成。
我只有在第一次运行 sqoop 时才会遇到这个问题。
我浏览了一些博客,错误可能与 JDBC 中的连接池有关。
我的背景主要是DATA相关,在JAVA方面没有太多经验。
谁能帮我找出实际问题和解决方案。
提前致谢!!
【问题讨论】:
【参考方案1】:您是否查看过数据库服务器上的负载? 我猜这就是瓶颈所在。这 配置仅对您有用,您可以扩展您的 数据库服务器,或者有多个服务器,每个服务器都有 一组不同的表格。
【讨论】:
我不认为这是由于负载问题。这是作为我们生产作业的一部分在数据库(大型机)服务器上运行的第一个 sqoop 查询。那时负载非常小,每天 sqoop 带来的记录不到 1.5k。所以你能建议任何其他的检查吗?【参考方案2】:参考24.1.Sqoop Supported Databases
参考Attunity Driver Configuration
尝试在 sqoop 导入命令中使用 --driver 选项指定适当的驱动程序。
下载 nvjdbc2.jar 并将其放置在 sqoop 文档中根据您的集群指定的适当位置。
要使用的类名:com.attunity.jdbc.NvDriver
虽然 JDBC 是一个兼容层,它允许程序通过一个通用 API 访问许多不同的数据库,但每个数据库使用的 SQL 语言的细微差别可能意味着 Sqoop 不能开箱即用地使用每个数据库,或者某些数据库的使用效率可能很低。
即使 Sqoop 在内部支持数据库,您可能仍需要在客户端的 $SQOOP_HOME/lib 路径中安装数据库供应商的 JDBC 驱动程序。 Sqoop 可以加载来自客户端 $SQOOP_HOME/lib 中任何 jar 的类,并将它们用作它运行的任何 MapReduce 作业的一部分;与旧版本不同,您不再需要在服务器上的 Hadoop 库路径中安装 JDBC jar。
【讨论】:
感谢您的回复。您是否建议在我们集群的所有数据节点中安装第三方 JDBC 驱动程序? 根据 sqoop 文档,您需要在客户端的 $SQOOP_HOME/lib 路径中安装数据库供应商的 JDBC 驱动程序,这很可能是您的边缘节点(网关)。实际上,这取决于您的要求是什么以及您将从哪台机器上运行 sqoop 导入命令。因此,如果您在所有数据节点上安装了 sqoop 并从任何数据节点触发 sqoop 导入,那么您需要将 jar 放在该数据节点中的 sqoop lib 位置下。 Jdbc jar 长时间放置在边缘节点的 $SQOOP_HOME/lib 路径中,我们从上个月开始就面临这个问题。这也是它第一次失败。我怀疑 JDBC/源服务器端出现了一些问题来解决这个问题。您在回答中提到的任何内容,我们都在关注它。还有其他推荐吗? 以下链接与 sqoop 连接不完全相关,但与套接字读取超时问题有关,应该可以帮助您进行更多调试和分析。 ***.com/questions/3069382/…***.com/questions/17079273/…ibm.com/support/pages/…以上是关于检测到 Sqoop 套接字超时:从大型机读取数据并插入 Hive 时读取超时的主要内容,如果未能解决你的问题,请参考以下文章