您好,登錄后才能下訂單哦!
魯春利的工作筆記,誰說程序員不能有文藝范?
Hive對外提供了三種服務模式,即CLI(command line interface)、Hive Web和Hive Client(如JavaApi方式)。
1、Hive命令行模式(CLI)
啟動Hive命令行模式有兩種方式
bin/hive 或 bin/hive --service cli
hive命令選項
[hadoop@nnode hive1.2.0]$ bin/hive --help Usage ./hive <parameters> --service serviceName <service parameters> Service List: beeline cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version # 這里對應hive <parameters>對應的參數 Parameters parsed: # 允許用戶指定一個以冒號分割的附屬jar包,如自定義的擴展等。 --auxpath : Auxillary jars # 指定文件目錄,覆蓋$HIVE_HOME/conf中默認的屬性配置 --config : Hive configuration directory # 需要啟動的服務,默認為cli,其他見Service List: --service : Starts specific service/component. cli is default Parameters used: HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory HIVE_OPT : Hive options For help on a particular service: # 查詢特定服務名的幫助 ./hive --service serviceName --help Debug help: ./hive --debug --help ## 使用version服務 [hadoop@nnode hive1.2.0]$ bin/hive --service version Hive 1.2.0 Subversion git://localhost.localdomain/home/sush/dev/hive.git -r 7f237de447bcd726bb3d0ba332cbb733f39fc02f Compiled by sush on Thu May 14 18:00:25 PDT 2015 From source with checksum 03a73b649153ba8e11467a779def6315 [hadoop@nnode hive1.2.0]$ ## 執行--service不跟任何參數 [hadoop@nnode hive1.2.0]$ bin/hive --service等效于bin/hive --service cli
Service List包括絕大多數將要使用的CLI,可以通過--service name服務名稱來啟動,默認為啟動cli。注意,個別服務實際上已提供了快捷啟動方式。
常用服務如下圖所示:
hive cli命令參數
[hadoop@nnode hive1.2.0]$ bin/hive --verbose --help usage: hive -d,--define <key=value> 定義hive命令行使用的參數,如-d A=B or --define A=B --database <databasename> 指定使用的數據庫 -e <quoted-query-string> 通過命令行執行SQL語句 -f <filename> 執行文件中的SQL語句 -H,--help 顯示幫助 --hiveconf <property=value> 給定參數值覆蓋hive-default.xml或hive-site.xml中參數值 --hivevar <key=value> 定義應用到hive中的變量,如--hivevar A=B(等價于-d) -i <filename> 初始化的sql文件 -S,--silent 靜態模式(無輸出) -v,--verbose 詳細模式 [hadoop@nnode hive1.2.0]$ ## 如 #hive -e "" #hive -e "">aaa #hive -S -e "">aaa #hive -e 'select a.col from tab1 a' #hive -f hdfs://<namenode>:<port>/hive-script.sql #hive -i /home/my/hive-init.sql #hive>source file #hive>!ls # 使用shell命令 #hive>dfs -ls / # 使用hdfs dfs命令(省略hdfs)
變量或屬性
在CLI中,可以通過set命令顯示或修改變量值,也可以通過命令空間指定。
Set操作示例
hive> set env:HOME; env:HOME=/home/hadoop hive> set env:HIVE_HOME; env:HIVE_HOME=/usr/local/hive1.2.0 hive>
命令空間指定方式為
示例代碼:
#hive --hivevar column=name #hive --hiveconf hive.cli.print.current.db=true hive.cli.print.header=true #system: java定義的配置屬性,如system:user.name(也就是System的properties的內容) #env:shell環境變量,如env:USER、env.HIVE_HOME ## 驗證hivevar、system、env [hadoop@nnode hive1.2.0]$ hive --hivevar column=name hive> create table test(id int, ${hivevar:column} string, ${system:user.name} string, path string); OK Time taken: 1.687 seconds hive> insert into table test values(1000, 'lisi', 'root', '${env:HOME}'); # mapreduce過程略 hive> set hive.cli.print.header=true; # 顯示header hive> select * from test; OK test.id test.name test.hadoop test.path # 獲取變量的值 1000 lisi root /home/hadoop Time taken: 0.147 seconds, Fetched: 1 row(s) hive> ## 驗證hiveconf [hadoop@nnode hive1.2.0]$ hive --hiveconf hive.cli.print.current.db=true hive (default)> use mywork; OK Time taken: 1.089 seconds hive (mywork)> set hive.cli.print.header=true; hive (mywork)> select eno, ename from employee; OK eno ename 1000 zhangsan Time taken: 0.223 seconds, Fetched: 1 row(s) hive (mywork)>
2、Hive的Web模式
HWI是Hive Web Interface的簡稱,是hive cli的一個web替換方案。
通過service啟動hwi服務的命令為bin/hive --service hwi
[hadoop@nnode hive1.2.0]$ bin/hive --service hwi ls: cannot access /usr/local/hive1.2.0/lib/hive-hwi-*.war: No such file or directory 15/12/12 22:30:08 INFO hwi.HWIServer: HWI is starting up 15/12/12 22:30:10 INFO mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog 15/12/12 22:30:10 INFO mortbay.log: jetty-6.1.26 15/12/12 22:30:11 INFO mortbay.log: Started SocketConnector@0.0.0.0:9999 [hadoop@nnode hive1.2.0]$
提示hwi的war文件不存在,通過find命令查看時確實無法找到hwi的war文件,采用將src下hwi/web目錄下的文件打成war包的形式來處理:
E:\Hive\apache-hive-1.2.0-src\hwi\web>jar cvf hive-hwi-1.2.0.war ./*
并將該war文件上傳到$HIVE_HOME/lib目錄下,并通過配置文件(hive-site.xml)修改hwi的配置參數
<property> <name>hive.hwi.listen.host</name> <value>nnode</value> <description>This is the host address the Hive Web Interface will listen on</description> </property> <property> <name>hive.hwi.listen.port</name> <value>9999</value> <description>This is the port the Hive Web Interface will listen on</description> </property> <property> <name>hive.hwi.war.file</name> <value>lib/hive-hwi-1.2.0.war</value> <description>This sets the path to the HWI war file, relative to ${HIVE_HOME}.</description> </property>
再次起啟動hwi的service服務,并通過web進行訪問
實際上已經將tools.jar添加到了classpath路徑中了,沒辦法,只能將jdk路徑下的tools.jar拷貝到hive的lib目錄下,然后再次通過hive --service hwi啟動,啟動后訪問,OK了。
主要包括:
USER 用戶信息,主要包括: 用戶認證(Authorize) 創建會話(Create Session) 會話管理(List Sessions) DATABASE 瀏覽數據庫及數據庫的表,類似于show databases;show tables;describe table; DIAGNOSTICS 查看系統診斷信息,如System.getProperties的值等。
在hwi中的用戶認證需要輸入用戶名和用戶組,如:
每一個用戶認證(Authorize)信息對應著一組會話(session)。這些數據在hive重啟后,session信息都會丟失。
在執行查詢之前需要先通過Create Session創建會話,可以通過List Session查看創建的會話。
通過List Session就可以查看到該認證用戶所對應的會話組了(實際沒感覺到什么用)。
點擊Manager執行查詢操作
提交查詢(Submit),會在Session Details顯示session的執行狀態,并可以通過View File查看結果
總結:個人感覺沒什么用,還不如cli操作方便。
3、Hive的遠程服務
實際上是將hive服務作為server啟動,然后通過JDBC連接到hive,提交需要執行的SQL語句,通過hive解析執行后將結果返回。
[hadoop@nnode hive1.2.0]$ bin/hive --service hiveserver Starting Hive Thrift Server Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hadoop.hive.service.HiveServer at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:274) at org.apache.hadoop.util.RunJar.run(RunJar.java:214) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) [hadoop@nnode hive1.2.0]$
Hive JDBC驅動連接分為兩種,早期的是HiveServer,最新的是HiveServer2,前者本身存在很多的問題,如安全性、并發性等,后者很好的解決了諸如安全性和并發性等問題。
簡介: 2015年02月08日Apache Hive 1.0.0 正式發布了。該版本原本是要命名為 Hive 0.14.1,但是團隊感覺 到了該用 1.x.y 的方式命名的時候了。不過該版本改變的內容并不多,值得關注的有兩個: 為 HiveMetaStoreClient 定義 API; 移除 HiveServer 1,全面使用 HiveServer 2。 參見:https://cwiki.apache.org/confluence/display/Hive/HiveServer
服務啟動程序為${HIVE_HOME}/bin/hiveserver2里面,通過下面的方式來啟動:
$HIVE_HOME/bin/hiveserver2 或 $HIVE_HOME/bin/hive --service hiveserver2 [hadoop@nnode hive1.2.0]$ ll bin/ total 32 -rwxr-xr-x 1 hadoop hadoop 1031 Apr 30 2015 beeline drwxr-xr-x 3 hadoop hadoop 4096 Jun 28 13:14 ext -rwxr-xr-x 1 hadoop hadoop 7844 May 8 2015 hive -rwxr-xr-x 1 hadoop hadoop 1900 Apr 30 2015 hive-config.sh -rwxr-xr-x 1 hadoop hadoop 885 Apr 30 2015 hiveserver2 -rwxr-xr-x 1 hadoop hadoop 832 Apr 30 2015 metatool -rwxr-xr-x 1 hadoop hadoop 884 Apr 30 2015 schematool [hadoop@nnode hive1.2.0]$
注意:
hiveserver默認端口是10000,可通過hive --service hiveserver -p 10002,更改默認啟動端口,此端口也是JDBC連接端口。
hiveserver不能和hwi服務同時啟動使用。
如果之前的代碼使用的是HiveServer(或者叫HiveServer1),當hive升級采用HiveServer2后,代碼部分需要做如下調整:
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; 改為 private static String driverName = "org.apache.hive.jdbc.HiveDriver"; Connection con = DriverManager.getConnection("jdbc:hive://ip:10002/default", "username", ""); 改為 Connection con = DriverManager.getConnection("jdbc:hive2://ip:10002/default", "username", "");
啟動服務
[hadoop@nnode hive1.2.0]$ bin/hiveserver2
JavaApi調用
package com.lucl.hive; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * * @author lucl * */ public class JDBCHiveDriver { private static String driver = "org.apache.hive.jdbc.HiveDriver"; private static String url = "jdbc:hive2://nnode:10000/mywork"; private static String user = "hadoop"; // 這里的用戶是hadoop集群的用戶 private static String pwd = ""; public static void main(String[] args) { String sql = "show tables"; try{ Class.forName(driver); Connection con = DriverManager.getConnection(url, user, pwd); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString(1)); } con.close(); } catch (Exception e) { e.printStackTrace(); } } }
Eclipse的Console輸出結果
11:25:11,348 INFO Utils:310 - Supplied authorities: nnode:10000 11:25:11,351 INFO Utils:397 - Resolved authority: nnode:10000 11:25:11,461 INFO HiveConnection:203 - Will try to open client transport with JDBC Uri: jdbc:hive2://nnode:10000/mywork table name is : employee table name is : employee_02 table name is : student
關于HiveServer2的使用幫助參見:
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-UsingJDBC
總結:
個人感覺通過JDBC方式操作Hive生產環境中意義不大,hive的查詢主要還是基于MapReduce實現(盡管部分功能已做了優化可以無需MR處理),而MapReduce屬于離線計算模型,時效性上可能會比較差,執行一次調用等幾分鐘甚至更長,一般人接收不了,比較好的方式還是通過JDBC訪問RDBMS來完成。
Hive的主要功能可能是其方便了對HDFS數據的處理,畢竟熟悉SQL的那波人不見得對JAVA或者MR編程熟悉,屬于HDFS的客戶端工具但畢竟能力有限。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。