標籤:
Hive 介面介紹(Web UI/JDBC)實驗簡介
本次實驗學習 Hive 的兩種介面:Web UI 以及 JDBC。
一、實驗環境說明
1. 環境登入
無需密碼自動登入,系統使用者名稱shiyanlou,密碼shiyanlou
2. 環境介紹
本實驗環境採用帶案頭的Ubuntu Linux環境,實驗中會用到案頭上的程式:
- XfceTerminal: Linux命令列終端,開啟後會進入Bash環境,可以使用Linux命令;
- Firefox:瀏覽器,可以用在需要前端介面的課程裡,只需要開啟環境裡寫的HTML/JS頁面即可;
- GVim:非常好用的編輯器,最簡單的用法可以參考課程Vim編輯器。
- Eclipse:Eclipse是著名的跨平台的自由整合式開發環境(IDE)。主要用來Java語言開發,但是目前亦有人通過外掛程式使其作為C++和Python等語言的開發工具。
3. 環境使用
使用GVim編輯器輸入實驗所需的代碼,然後使用XfceTerminal命令列環境進行編譯運行,查看運行結果,運行後可以並分享自己的實驗成果,實驗樓提供的是後台,無法作弊,可以真實有效證明您已經完成了實驗。
實驗記錄頁面可以在“我的課程”中查看,其中含有每次實驗的及筆記,以及每次實驗的有效學習時間(指的是在實驗案頭內操作的時間,如果沒有操作,系統會記錄為發獃時間)。這些都是您學習的真實性證明。
4. 其他
之前的實驗中,我們使用的是 Hadoop V2.4.1版本。 我們在測試的時候,發現 Hive V1.1.0 在進行 Session 查詢的時候需要 Hadoop V2.6 以上版本,因此本次實驗的 Hadoop 版本基於 V2.6.0 版本。由於已經修改 Hadoop 目錄、Hive 目錄為普通許可權,如果提示 hadoop 或 hive 為無效命令,請 source /etc/profile
來使設定檔生效。
Hadoop 目錄為 : /usr/local/hadoop-2.6.0
Hive 目錄為: /usr/local/hive-1.1.0
二、Hive 網路介面(Web UI)
(1)Web UI 簡介
Hive Web UI 提供了映像化的操作介面,通過 Hive Web UI 介面可以更方便、更直觀地操作,特別是對剛剛接觸 Hive 的使用者來說。Hive Web UI 具有一下特性:
分離查詢的執行
在命令列(CLI)下,要執行多個查詢就得開啟多個終端,而通過Web UI,就可以同時執行多個查詢,還可以在網路伺服器上管理會話 Session。
不依賴本地 Hive
使用者需要安裝本地 Hive,就可以通過網路瀏覽器訪問 Hive 並進行相關操作。如果想通過 Web 與 Hadoop 以及 Hive 互動,那麼需要訪問多個連接埠。
(2)配置 hive-site.xml
修改 $HIVE_HOME/conf
目錄下的 hive-site.xml 檔案。
我們可以看一下預設配置是什麼:
我們只需要修改 hive.hwi.war.file
,你應該先在$HIVE_HOME/lib
目錄下檢查一下 hwi 的版本:
結果令人吃驚的是,居然沒有那個 war
檔案! 只有一個同名的 jar 包,沒有 war 檔案。解決辦法是自行下載對應 Hive 的源碼包再打包成 war 檔案。
下載 Hive 源碼(注意這裡是 src 包,不是 bin 包。上次我們使用的是 1.1.0 版本)
$ wget http://labfile.oss.aliyuncs.com/apache-hive-1.1.0-src.tar.gz
解壓:
$ tar zxvf apache-hive-1.1.0.src.tar.gz
再進入 hwi 目錄,打包 war 檔案(注意命令末尾有一個點.
):
$ cd apache-hive-1.1.0-src/hwi$ jar cvfM0 hive-hwi-1.1.0.war -C web/ .
打包完成後,有了我們需要的 war 檔案,再複製到 $HIVE_HOME/lib 目錄下:
$ cp hive-hwi-1.1.0.war /usr/local/hive-1.1.0/lib
另外我們還需要拷貝一個 Java 的 tools.jar 到 $HIVE_HOME/lib 目錄下:
$ cp /usr/local/jdk1.7.0_67/lib/tools.jar /usr/local/hive-1.1.0/lib
否則會出現類似於下面的錯誤(因為 JAVA_HOME 指到$JAVA_HOME/jre
下了,而其 lib下的 tools.jar 跟$JAVA_HOME/lib/tools.jar
不一樣,編譯的時候需要用到後者):
最後,我們將 hive-site.xml 檔案修改為:
<property> <name>hive.hwi.war.file</name> <value>/lib/hive-hwi-1.1.0.war</value> <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}. </description></property>
(3)啟動 hwi
在 $HIVE_HOME/bin 目錄下,啟動 hwi(由於我們之前已經修改了 Derby 為 MySQL 資料庫,所以在啟動 hwi 之前,請確保 MySQL 和 Hadoop 已經成功啟動):
$ hive --service hwi
現在,我們可以在瀏覽器中開啟網路介面的地址:localhost:9999/hwi
, 啟動成功:
(4)Web UI 操作執行個體
資料庫及表資訊查詢
在查詢之前,我們先建立一個 person表 以方便後續的查詢操作。啟動 Hive 後,輸入如下命令(這個 table 只是一個樣本,你可以根據需要自己建立其他的):
建立一個 txt 檔案(路徑自訂,比如我是 /home/hadoop/hive/person.txt),寫一些樣本資料,資料之間是以 \t
劃分的;實驗中已經寫好,直接匯入即可:
再把資料匯入到 person表 中:
單擊 Browse Schema
可以查看當前 Hive 中的資料庫,顯示的是當前可以是使用的資料庫資訊,只包含一個預設資料庫(default):
再單擊 default 就可以看到 default 資料庫中包含的所有表的資訊了(這裡有我們剛剛建立的 table : person表):
點擊 person 表即可看到具體資訊。
Hive Session 查詢
在進行查詢之前我們需要建立一個 Session(注意每次重啟hwi後,之前的 Session 將會失效)。點擊 Create Session 來建立:
填入以下資訊,打框的必填:
其中: Result File 為最後的查詢結果檔案;
Query 為你的查詢語句;
Start Query 設為 YES,表示開始查詢;
點擊 Submit 提交後,即可看到 View File:
點擊 View File 即可看到最後的查詢結果:
通過以上的學習,我們可以瞭解到 Web UI 雖然提供了可視化的查詢操作,但最大的缺點就是使用者不能即時瞭解查詢的狀態,互動能力較差。
三、
JDBC
在 Eclipse 中建立一個 Java 工程,例如 HiveJdbc. 然後添加所需要的 jar 包,右擊工程,依次選擇 Properties -> Java Build Path -> Libraries -> Add External Jars 來添加。所需 jar 包如下(如不清楚你可以直接添加所有的 jar 包;遇到沒有許可權添加的,請拷貝 jar 包到其他有許可權的目錄再添加,實驗中已經拷貝到 /home/hadoop/hive
):
建立包和類,添加如下代碼:
import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveJdbc { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); String tableName = "hive_jdbc"; stmt.execute("drop table if exists " + tableName); stmt.execute("create table " + tableName + " (key int, value string)"); System.out.println("Create table success!"); // show tables String sql = "show tables ‘" + tableName + "‘"; System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); if (res.next()) { System.out.println(res.getString(1)); } // describe table sql = "describe " + tableName; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } sql = "select * from " + tableName; res = stmt.executeQuery(sql); while (res.next()) { System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2)); } sql = "select count(1) from " + tableName; System.out.println("Running: " + sql); res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); } }}
從上述代碼可以看出,在進行查詢之前需要做的工作有:
通過 Class.ForName("org.apache.hive.jdbc.HiveDriver"); 來註冊 Hive 驅動;
通過 Connection con = DriverManager.getConnection( "jdbc:hive2://localhost:10000/default", "", ""); 來與 Hive 資料庫建立串連;
運行之前需要啟動 hiveserver,但目前 Hive 摒棄了 hiveserver 轉而改用了 hiveserver2,反映在代碼中有兩點不同。一是,driverName由 org.apache.hadoop.hive.jdbc.HiveDriver
改成了 org.apache.hive.jdbc.HiveDriver
;二是,Connection 由 jdbc:hive://localhost:10000/default
改成了 jdbc:hive2://localhost:10000/default
。
因此,在運行程式前啟動 hiveserver 也改成了啟動 hiveserver2,在 $HIVE_HOME/bin 目錄下來啟動。
最後程式運行結果如下:
作業
Web UI 和 JDBC 兩種介面有什麼異同?
參考文檔
- 《Hadoop實戰 第2版》陸嘉恒,機械工業出版社;
- Hive Web介面HWI的操作及使用;
- hive jdbc 調用;
Hive 介面介紹(Web UI/JDBC)