本次實驗學習 Hive 的兩種接口:Web UI 以及 JDBC。html
1. 環境登陸前端
無需密碼自動登陸,系統用戶名shiyanlou,密碼shiyanloujava
2. 環境介紹web
本實驗環境採用帶桌面的Ubuntu Linux環境,實驗中會用到桌面上的程序:sql
- XfceTerminal: Linux命令行終端,打開後會進入Bash環境,可使用Linux命令;
- Firefox:瀏覽器,能夠用在須要前端界面的課程裏,只須要打開環境裏寫的HTML/JS頁面便可;
- GVim:很是好用的編輯器,最簡單的用法能夠參考課程Vim編輯器。
- Eclipse:Eclipse是著名的跨平臺的自由集成開發環境(IDE)。主要用來Java語言開發,可是目前亦有人經過插件使其做爲C++和Python等語言的開發工具。
3. 環境使用數據庫
使用GVim編輯器輸入實驗所需的代碼,而後使用XfceTerminal命令行環境進行編譯運行,查看運行結果,運行後能夠截圖並分享本身的實驗成果,實驗樓提供的截圖是後臺截圖,沒法做弊,能夠真實有效證實您已經完成了實驗。apache
實驗記錄頁面能夠在「個人課程」中查看,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面內操做的時間,若是沒有操做,系統會記錄爲發呆時間)。這些都是您學習的真實性證實。瀏覽器
4. 其餘ruby
以前的實驗中,咱們使用的是 Hadoop V2.4.1版本。 咱們在測試的時候,發現 Hive V1.1.0 在進行 Session 查詢的時候須要 Hadoop V2.6 以上版本,所以本次實驗的 Hadoop 版本基於 V2.6.0 版本。因爲已經修改 Hadoop 目錄、Hive 目錄爲普通權限,若是提示 hadoop 或 hive 爲無效命令,請 source /etc/profile
來使配置文件生效。bash
Hadoop 目錄爲 : /usr/local/hadoop-2.6.0
Hive 目錄爲: /usr/local/hive-1.1.0
(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 雖然提供了可視化的查詢操做,但最大的缺點就是用戶不能實時瞭解查詢的狀態,交互能力較差。
在 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 調用;