检测到 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 时读取超时的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何超时读取Java Socket?

在 *nix 中处理多路复用套接字的读取超时

从输入流Java读取时有没有办法超时? [复制]

阻塞套接字 - 检测状态

使用异步套接字编程发送二进制数据并读取其值

网络编程中的超时检测