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中使用的端口:

Component Service Port Access Requirement Comment

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM