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 調用;