溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

發(fā)布時(shí)間:2020-07-05 16:58:17 來源:網(wǎng)絡(luò) 閱讀:4341 作者:luchunli1985 欄目:大數(shù)據(jù)

魯春利的工作筆記,誰說程序員不能有文藝范?



Hive對(duì)外提供了三種服務(wù)模式,即CLI(command line interface)、Hive Web和Hive Client(如JavaApi方式)。


1、Hive命令行模式(CLI)

啟動(dòng)Hive命令行模式有兩種方式

bin/hive
或
bin/hive --service cli


hive命令選項(xiàng)

[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 
# 這里對(duì)應(yīng)hive <parameters>對(duì)應(yīng)的參數(shù)
Parameters parsed:
  # 允許用戶指定一個(gè)以冒號(hào)分割的附屬jar包,如自定義的擴(kuò)展等。
  --auxpath : Auxillary jars 
  # 指定文件目錄,覆蓋$HIVE_HOME/conf中默認(rèn)的屬性配置
  --config : Hive configuration directory
  # 需要啟動(dòng)的服務(wù),默認(rèn)為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: # 查詢特定服務(wù)名的幫助
  ./hive --service serviceName --help
Debug help:  ./hive --debug --help
## 使用version服務(wù)
[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]$ 
## 執(zhí)行--service不跟任何參數(shù)
[hadoop@nnode hive1.2.0]$ bin/hive --service等效于bin/hive --service cli

Service List包括絕大多數(shù)將要使用的CLI,可以通過--service name服務(wù)名稱來啟動(dòng),默認(rèn)為啟動(dòng)cli。注意,個(gè)別服務(wù)實(shí)際上已提供了快捷啟動(dòng)方式。

常用服務(wù)如下圖所示:

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口


hive cli命令參數(shù)

[hadoop@nnode hive1.2.0]$ bin/hive --verbose --help
usage: hive
 -d,--define <key=value>              定義hive命令行使用的參數(shù),如-d A=B or --define A=B
 --database <databasename>            指定使用的數(shù)據(jù)庫
 -e <quoted-query-string>             通過命令行執(zhí)行SQL語句
 -f <filename>                        執(zhí)行文件中的SQL語句
 -H,--help                            顯示幫助
 --hiveconf <property=value>          給定參數(shù)值覆蓋hive-default.xml或hive-site.xml中參數(shù)值
 --hivevar <key=value>                定義應(yīng)用到hive中的變量,如--hivevar A=B(等價(jià)于-d)
 -i <filename>                        初始化的sql文件
 -S,--silent                          靜態(tài)模式(無輸出)
 -v,--verbose                         詳細(xì)模式
[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)


變量或?qū)傩?/p>

    在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-1.2.0學(xué)習(xí)筆記(三)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的內(nèi)容)
#env:shell環(huán)境變量,如env:USER、env.HIVE_HOME

## 驗(yàn)證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> 

## 驗(yàn)證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)>


Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口


2、Hive的Web模式

HWI是Hive Web Interface的簡稱,是hive cli的一個(gè)web替換方案。

通過service啟動(dòng)hwi服務(wù)的命令為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命令查看時(shí)確實(shí)無法找到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的配置參數(shù)

<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>

再次起啟動(dòng)hwi的service服務(wù),并通過web進(jìn)行訪問

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

實(shí)際上已經(jīng)將tools.jar添加到了classpath路徑中了,沒辦法,只能將jdk路徑下的tools.jar拷貝到hive的lib目錄下,然后再次通過hive --service hwi啟動(dòng),啟動(dòng)后訪問,OK了。

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

主要包括:

USER            用戶信息,主要包括:
                    用戶認(rèn)證(Authorize)
                    創(chuàng)建會(huì)話(Create Session)
                    會(huì)話管理(List Sessions)
DATABASE        瀏覽數(shù)據(jù)庫及數(shù)據(jù)庫的表,類似于show databases;show tables;describe table;          
DIAGNOSTICS     查看系統(tǒng)診斷信息,如System.getProperties的值等。

在hwi中的用戶認(rèn)證需要輸入用戶名和用戶組,如:

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

每一個(gè)用戶認(rèn)證(Authorize)信息對(duì)應(yīng)著一組會(huì)話(session)。這些數(shù)據(jù)在hive重啟后,session信息都會(huì)丟失。

在執(zhí)行查詢之前需要先通過Create Session創(chuàng)建會(huì)話,可以通過List Session查看創(chuàng)建的會(huì)話。

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

通過List Session就可以查看到該認(rèn)證用戶所對(duì)應(yīng)的會(huì)話組了(實(shí)際沒感覺到什么用)。

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

點(diǎn)擊Manager執(zhí)行查詢操作

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

提交查詢(Submit),會(huì)在Session Details顯示session的執(zhí)行狀態(tài),并可以通過View File查看結(jié)果

Hive-1.2.0學(xué)習(xí)筆記(三)Hive用戶接口

總結(jié):個(gè)人感覺沒什么用,還不如cli操作方便


3、Hive的遠(yuǎn)程服務(wù)

實(shí)際上是將hive服務(wù)作為server啟動(dòng),然后通過JDBC連接到hive,提交需要執(zhí)行的SQL語句,通過hive解析執(zhí)行后將結(jié)果返回。

[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驅(qū)動(dòng)連接分為兩種,早期的是HiveServer,最新的是HiveServer2,前者本身存在很多的問題,如安全性、并發(fā)性等,后者很好的解決了諸如安全性和并發(fā)性等問題。

簡介:
2015年02月08日Apache Hive 1.0.0 正式發(fā)布了。該版本原本是要命名為 Hive 0.14.1,但是團(tuán)隊(duì)感覺
到了該用 1.x.y 的方式命名的時(shí)候了。不過該版本改變的內(nèi)容并不多,值得關(guān)注的有兩個(gè):
    為 HiveMetaStoreClient 定義 API;
    移除 HiveServer 1,全面使用 HiveServer 2。
參見:https://cwiki.apache.org/confluence/display/Hive/HiveServer

服務(wù)啟動(dòng)程序?yàn)?{HIVE_HOME}/bin/hiveserver2里面,通過下面的方式來啟動(dòng):

$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默認(rèn)端口是10000,可通過hive --service hiveserver -p 10002,更改默認(rèn)啟動(dòng)端口,此端口也是JDBC連接端口。

    hiveserver不能和hwi服務(wù)同時(shí)啟動(dòng)使用。


如果之前的代碼使用的是HiveServer(或者叫HiveServer1),當(dāng)hive升級(jí)采用HiveServer2后,代碼部分需要做如下調(diào)整:

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", "");


啟動(dòng)服務(wù)

[hadoop@nnode hive1.2.0]$ bin/hiveserver2


JavaApi調(diào)用

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輸出結(jié)果

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

關(guān)于HiveServer2的使用幫助參見:

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-UsingJDBC


總結(jié):

    個(gè)人感覺通過JDBC方式操作Hive生產(chǎn)環(huán)境中意義不大,hive的查詢主要還是基于MapReduce實(shí)現(xiàn)(盡管部分功能已做了優(yōu)化可以無需MR處理),而MapReduce屬于離線計(jì)算模型,時(shí)效性上可能會(huì)比較差,執(zhí)行一次調(diào)用等幾分鐘甚至更長,一般人接收不了,比較好的方式還是通過JDBC訪問RDBMS來完成。

    Hive的主要功能可能是其方便了對(duì)HDFS數(shù)據(jù)的處理,畢竟熟悉SQL的那波人不見得對(duì)JAVA或者M(jìn)R編程熟悉,屬于HDFS的客戶端工具但畢竟能力有限。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI