Java使用JDBC连接Impala

  前段时间,有一个项目在连接Impala的时候,可以测试连接成功,但是查询不出表。但是通过impala-shell的时候,是可以查询出来的,我觉的这种方式查询出来的话,可能和jdbc的方式不一样,因为impala-shell连接的端口是21000,jdbc连接的端口是21050。我通过beeline的方式使用jdbc:hive2:的方式查询,因为impala和hive使用同一个metastore服务。刚开始的时候用jdbc:hive2://node1:21050/去连接,能成功,但是查询不出数据,而且使用hiveserver2的时候,得切换到hive用户下,我就发现是不是用户没有设置,导致查询不出对应的权限。最后才发现,确实是jdbc url的设置问题,现在总结如下:

一、Impala中使用的端口:

ComponentServicePortAccess RequirementComment

Impala Daemon

Impala Daemon Frontend Port

21000

External

Used to transmit commands and receive results by impala-shelland version 1.2 of the Cloudera ODBC driver.

Impala Daemon

Impala Daemon Frontend Port

21050

External

Used to transmit commands and receive results by applications, such as Business Intelligence tools, using JDBC, the Beeswax query editor in Hue, and version 2.0 or higher of the Cloudera ODBC driver.

其中,21000是impala-shell使用,21050是impala jdbc使用。

 

二、JDBC Driver

在Impala 2.0以后,可以使用两种方式去连接impala, Cloudera JDBC Connector 和 Hive 0.13 JDBC driver,一般推荐使用的是Cloudera JDBC 2.5 Connector。

 

三、连接Impala

这里有一个CDH官方给出的例子,包括使用的jar包:https://github.com/onefoursix/Cloudera-Impala-JDBC-Example,这里不做具体的说明,主要是对URL进行解释。

使用hive驱动连接的时候,jdbc url为jdbc:hive2://host:port/;auth=noSasl,使用cloudera驱动时为:

jdbc:impala://Host:Port[/Schema];Property1=Value;Property2=Value;...

驱动类使用:

com.cloudera.impala.jdbc41.Driver

例如连接URL为:

jdbc:impala://localhost:21050;AuthMech=3;UID=UserName;PWD=Password

Impala支持多种安全机制,如:

  • 没有认证
jdbc:impala://localhost:21050;AuthMech=0
  • 使用Kerberos认证
jdbc:impala://localhost:21050;AuthMech=1;KrbRealm=EXAMPLE.COM;KrbHostFQDN=impala.example.com;KrbServiceName=impala
  • 使用用户名来验证
jdbc:impala://localhost:21050;AuthMech=2;UID=impala
  • 使用用户名和密码
jdbc:impala://localhost:21050;AuthMech=3;UID=impala;PWD=*****
  • 使用用户名、密码和安全连接
jdbc:impala://localhost:21050;AuthMech=4;SSLKeyStore=C:\\Users\\bsmith\\Desktop\\keystore.jks;SSLKeyStorePwd=*****;UID=impala;PWD=*****

 

关于URL后面的参数有AuthMech、DefaultStringColumnLength、DelegationUID、KrbFQDN、KrbRealm、KrbServiceName、PWD、RowsFetchedPerBlock、SocketTimeout、SSLKeyStore、SSLKeyStorePwd、UID、UseNativeQuery、CatalogSchemaSwitch、PreparedMetaLimitZero等。

前面的问题就是因为未指定UID导致,但是通过上面这些,还是没能解决其他错误,最后查询得知,由于说是驱动问题,需呀增加参数UseSasl=0才可以,修改后的如下:

jdbc:impala://node1:21050/default;UseSasl=0;AuthMech=3;UID=impala;PWD=

或者(区别就是没有增加PWD属性)

jdbc:impala://node1:21050/default;UseSasl=0;AuthMech=3;UID=impala

 

特别说明,在使用kerberos的时候,需要在建立连接之前,进行kerberos登录(UserGroupInformation.loginFromKeytab),具体不再详述。

四、Impala 负载均衡

在Impala的配置界面,有设置Impala Load Balancer的地方,就是进行负载均衡,防止某一个Impalad负载过大,由于客户使用多个Impalad服务,故也配置了负载均衡,只需要在使用jdbc时的url中指定负载的地址和端口即可。

 

参看:

1.官网:https://www.cloudera.com/documentation/enterprise/latest/topics/impala_jdbc.html

2.驱动问题:https://blog.csdn.net/tom_fans/article/details/84838936

 

posted @ 2019-07-27 18:27  风雨咒之无上密籍  阅读(12926)  评论(0编辑  收藏  举报