hadoop學習之HIVE(3.2):hadoop2.7.2下配置hiveserver2啟動遠端連線
./hive只是啟動本地客戶端,往往用來測試,我們可以啟動hive server2伺服器用於遠端連線,方便開發。
前提是配置好hadoop和hive
1,開啟hive server服務:bin/hiveserver2
可檢視服務是否開啟:netstat -nplt | grep 10000
2,新開一個視窗,啟動客戶端,測試能否連線伺服器:
$ bin/beeline
beeline> !connect jdbc:hive2://localhost:10000
輸入使用者名稱,hive預設使用者是root,不過如果你是用其他的使用者建立的hadoop和hive,就使用你的使用者名稱,密碼無,直接回車。
若出現如下資訊,說明連線成功:Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000>
3,連線成功後,就可以命令列操作,也可以像第4步一樣遠端連線後操作。
4,現在可以用eclipse連線hiveserver2寫程式碼了:
a,新建java project,匯入jar包:Project->Properties->Java Build Path->Libraries->Add External JARs,
分別找到並匯入:hive\lib目錄下的所有jar包;hadoop\share\hadoop\common\下的3個jar包;hadoop\share\hadoop\common\lib\下的以“slf4j-”開頭的2個jar包。
b,新建java檔案,內容如下:
package com.xxx.hive; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class ConnectTest { public static void main(String[] args) throws Exception { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection ("jdbc:hive2://localhost:10000/default", "你的使用者名稱", ""); try { Statement stat = conn.createStatement(); ResultSet ret = stat.executeQuery("select count(*) from stu"); while(ret.next()) { System.out.println(ret.getInt(1)); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { conn.close(); } } }
這段程式碼連線hiveserver2執行hiveql語句,轉化為mr程式執行並返回執行結果。
可能會出現錯誤:
(1):當執行!connect jdbc:hive2://localhost:10000時,出現錯誤:
Error: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: jimmyhadoop is not allowed to impersonate root (state=,code=0)
解決辦法:終止hadoop,修改etc/hadoop/core-site.xml,新增兩項:
<property>
<name>hadoop.proxyuser.username.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.username.groups</name>
<value>*</value>
</property>
其中的username改成你hadoop master主機的使用者名稱,儲存,重啟hadoop,重新連線hive。
(2):hive2.X已經沒有timeout中5000L的錯誤了,1.x中有的話就把L刪掉。