Impala ODBC/JDBC 性能不佳 - 与 NN 相比,从远程服务器获取行的速度非常慢
Impala ODBC/JDBC bad performance - rows fetch is very slow from a remote server compared with NN
在CDH的NameNode中,当我运行通过odbc脚本(php/perl或python)查询时,我可以fetchAll结果(9.2M) 在大约 30 秒 的变量中,但是当我在另一台远程 2 服务器上尝试使用相同的 script/query 时,执行时间是在第一台服务器 28 分钟 秒后 17 分钟.
为了排除网络速度问题的假设,我在一个文件上获取结果,然后使用 scp 命令将其复制到第一个远程服务器,并在 ~40 秒内完成.
我在 CM 中的查询信息中观察到,线程之间存在很大差异:3 个查询中的网络发送等待时间 值:
在 NN 查询中:9.40s
在第一个远程服务器中:16.7m
在第二个远程服务器中:26.8m
我也用Impala JDBC尝试了一个java脚本,但是NN中的结果已经无法刺激继续。
但是到目前为止我还没有找到问题出在哪里以及如何解决。
注意:我正在使用 CDH 5.12.0/Impala 2.9.0,我安装了 Impala ODBC 2.5.37.1014。
没有提及使用的 JDBC 连接器版本。
您的集群中可能有多个服务器 Impala 守护进程 运行,请进行相应的更改
在您的 JDBC 连接中 URL 并验证这些服务器上的性能。
以防万一您错过了参考文档 (https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_jdbc.html),请注意此摘录:
The latest JDBC driver, corresponding to Hive 0.13, provides
substantial performance improvements for Impala queries that return
large result sets. Impala 2.0 and later are compatible with the Hive
0.13 driver. If you already have an older JDBC driver installed, and are running Impala 2.0 or higher, consider upgrading to the latest
Hive JDBC driver for best performance with JDBC applications.
由于您正在使用远程计算机访问 Impala,请同时参考此信息:
If you are using JDBC-enabled applications on hosts outside the CDH
cluster, you cannot use the CDH install procedure on the non-CDH
hosts. Install the JDBC driver on at least one CDH host .... Then
download the JAR files to each client machine that will use JDBC with
Impala...
如果之前没有完成,请更新 JDBC 连接器,并确保所有 impalad 实例都是 运行ning。
然后比较ODBC和JDBC.
的性能结果
这篇link也值得参考:
https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_troubleshooting.html
更新 1:
按照参考中的建议,尝试将以下参数添加到 JDBC 连接字符串并检查日志:
;LogLevel=6;LogPath=/path/to/directory
参考#2:https://issues.apache.org/jira/browse/IMPALA-2651您可以考虑以下设置:
SET disable_codegen=true;
更新 2: 我猜你已经在集群中的至少一个 Impala 服务器中安装了下面提到的这些 jar。
commons-logging-X.X.X.jar
hadoop-common.jar
hive-common-X.XX.X-cdhX.X.X.jar
hive-jdbc-X.XX.X-cdhX.X.X.jar
hive-metastore-X.XX.X-cdhX.X.X.jar
hive-service-X.XX.X-cdhX.X.X.jar
httpclient-X.X.X.jar
httpcore-X.X.X.jar
libfb303-X.X.X.jar
libthrift-X.X.X.jar
log4j-X.X.XX.jar
slf4j-api-X.X.X.jar
slf4j-logXjXX-X.X.X.jar
请将这些 jar 复制到您尝试通过 JDBC 代码访问 Impala 的机器上。确保这些 jar 在您的 classpath 中并执行 JDBC 代码。
我终于在将近 6 个月后找到了解决方案!
一直是关于我的1024限制的评论,行批限制来自BATCH_SIZE最大值(1024),在上一个版本(CDH 5.14/Impala 2.11)我们有一个新的有效范围是 1-65536.
1-1024: https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_batch_size.html
1-65536: https://www.cloudera.com/documentation/enterprise/5-14-x/topics/impala_batch_size.html
因此,当我通过 odbc.ini 和 SSP_BATCH_SIZE 增加它时,我可以从增加其他 odbc 参数 (RowsFetchedPerBlock / TSAslTransportBufSize) 中获益,并且可以在几秒钟内获取行 (~45秒)而不是几十分钟。
感谢大家的回复。
在CDH的NameNode中,当我运行通过odbc脚本(php/perl或python)查询时,我可以fetchAll结果(9.2M) 在大约 30 秒 的变量中,但是当我在另一台远程 2 服务器上尝试使用相同的 script/query 时,执行时间是在第一台服务器 28 分钟 秒后 17 分钟.
为了排除网络速度问题的假设,我在一个文件上获取结果,然后使用 scp 命令将其复制到第一个远程服务器,并在 ~40 秒内完成.
我在 CM 中的查询信息中观察到,线程之间存在很大差异:3 个查询中的网络发送等待时间 值:
在 NN 查询中:9.40s
在第一个远程服务器中:16.7m
在第二个远程服务器中:26.8m
我也用Impala JDBC尝试了一个java脚本,但是NN中的结果已经无法刺激继续。
但是到目前为止我还没有找到问题出在哪里以及如何解决。
注意:我正在使用 CDH 5.12.0/Impala 2.9.0,我安装了 Impala ODBC 2.5.37.1014。
没有提及使用的 JDBC 连接器版本。
您的集群中可能有多个服务器 Impala 守护进程 运行,请进行相应的更改 在您的 JDBC 连接中 URL 并验证这些服务器上的性能。
以防万一您错过了参考文档 (https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_jdbc.html),请注意此摘录:
The latest JDBC driver, corresponding to Hive 0.13, provides substantial performance improvements for Impala queries that return large result sets. Impala 2.0 and later are compatible with the Hive 0.13 driver. If you already have an older JDBC driver installed, and are running Impala 2.0 or higher, consider upgrading to the latest Hive JDBC driver for best performance with JDBC applications.
由于您正在使用远程计算机访问 Impala,请同时参考此信息:
If you are using JDBC-enabled applications on hosts outside the CDH cluster, you cannot use the CDH install procedure on the non-CDH hosts. Install the JDBC driver on at least one CDH host .... Then download the JAR files to each client machine that will use JDBC with Impala...
如果之前没有完成,请更新 JDBC 连接器,并确保所有 impalad 实例都是 运行ning。 然后比较ODBC和JDBC.
的性能结果这篇link也值得参考: https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_troubleshooting.html
更新 1:
按照参考中的建议,尝试将以下参数添加到 JDBC 连接字符串并检查日志:
;LogLevel=6;LogPath=/path/to/directory
参考#2:https://issues.apache.org/jira/browse/IMPALA-2651您可以考虑以下设置:
SET disable_codegen=true;
更新 2: 我猜你已经在集群中的至少一个 Impala 服务器中安装了下面提到的这些 jar。
commons-logging-X.X.X.jar
hadoop-common.jar
hive-common-X.XX.X-cdhX.X.X.jar
hive-jdbc-X.XX.X-cdhX.X.X.jar
hive-metastore-X.XX.X-cdhX.X.X.jar
hive-service-X.XX.X-cdhX.X.X.jar
httpclient-X.X.X.jar
httpcore-X.X.X.jar
libfb303-X.X.X.jar
libthrift-X.X.X.jar
log4j-X.X.XX.jar
slf4j-api-X.X.X.jar
slf4j-logXjXX-X.X.X.jar
请将这些 jar 复制到您尝试通过 JDBC 代码访问 Impala 的机器上。确保这些 jar 在您的 classpath 中并执行 JDBC 代码。
我终于在将近 6 个月后找到了解决方案!
一直是关于我的1024限制的评论,行批限制来自BATCH_SIZE最大值(1024),在上一个版本(CDH 5.14/Impala 2.11)我们有一个新的有效范围是 1-65536.
1-1024: https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_batch_size.html 1-65536: https://www.cloudera.com/documentation/enterprise/5-14-x/topics/impala_batch_size.html
因此,当我通过 odbc.ini 和 SSP_BATCH_SIZE 增加它时,我可以从增加其他 odbc 参数 (RowsFetchedPerBlock / TSAslTransportBufSize) 中获益,并且可以在几秒钟内获取行 (~45秒)而不是几十分钟。
感谢大家的回复。