Hive(一):基礎

一、Hive簡介

1.1 Hive概述

Hive是由Facebook開源用於解決海量結構化日誌的數據統計。

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的文件數據映射爲一張表,並提供類SQL查詢功能。

Hive本質就是將HQL轉換爲MapReduce程序,其處理的數據存儲在HDFS,分析數據底層的實現是MapReduce,執行程序運行在Yarn上。

1.2 Hive的優缺點

優點:

  1. 操作接口採用類SQL語法,提供快速開發的能力(簡單、容易上手)
  2. 避免了去寫MapReduce,減少開發人員的學習成本
  3. Hive的執行延遲比較高,因此Hive常用於數據分析,對實時性要求不高的場合
  4. Hive優勢在於處理大數據,對於處理小數據沒有優勢,因爲Hive的執行延遲比較高
  5. Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數

缺點:

  1. Hive的HQL表達能力有限:迭代式算法無法表達;數據挖掘方面不擅長,由於MapReduce數據處理流程的限制,效率更高的算法卻無法實現。
  2. Hive的效率比較低Hive自動生成的MapReduce作業,通常情況下不夠智能化;Hive調優比較困難,粒度較粗。

1.3 Hive架構原理

在這裏插入圖片描述
Hive通過給用戶提供的一系列交互接口,接收到用戶的指令(SQL),使用自己的Driver,結合元數據(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最後,將執行返回的結果輸出到用戶交互接口。

  1. 用戶接口:Client
    CLIcommand-line interface)、JDBC/ODBC(JDBC訪問Hive)、WEBUI(瀏覽器訪問Hive
  2. 元數據:Metastore
    元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;
    默認存儲在自帶的Derby數據庫中,推薦使用MySQL存儲Metastore
  3. Hadoop
    使用HDFS進行存儲,使用MapReduce進行計算
  4. 驅動器:Driver
    ①解析器(SQL Parser):將SQL字符串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、字段是否存在、SQL語義是否有誤。
    ②編譯器(Physical Plan):將AST編譯生成邏輯執行計劃。
    ③優化器(Query Optimizer):對邏輯執行計劃進行優化。
    ④執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃。對於Hive來說,就是MR/Spark

1.4 Hive和數據庫比較

由於Hive採用了類似SQL的查詢語言HQL(Hive Query Language),因此很容易將Hive理解爲數據庫。其實從結構上來看,Hive和數據庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述Hive和數據庫的差異。數據庫可以用在Online的應用中,但是Hive是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解Hive的特性。

查詢語言
由於SQL被廣泛的應用在數據倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。

數據存儲位置
Hive是建立在Hadoop之上的,所有Hive的數據都是存儲在HDFS中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。

數據更新
由於Hive是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive中不建議對數據的改寫,所有的數據都是在加載的時候確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES添加數據,使用UPDATE … SET修改數據。

執行
Hive中大多數查詢的執行是通過Hadoop提供的MapReduce來實現的。而數據庫通常有自己的執行引擎。

執行延遲
Hive在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致Hive執行延遲高的因素是MapReduce框架。由於MapReduce本身具有較高的延遲,因此在利用MapReduce執行Hive查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive的並行計算顯然能體現出優勢。

可擴展性
由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的(世界上最大的Hadoop集羣在Yahoo!,2009年的規模在4000臺節點左右)。而數據庫由於ACID語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫Oracle在理論上的擴展能力也只有100臺左右。

數據規模
由於Hive建立在集羣上並可以利用MapReduce進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

二、Hive安裝

2.1 Hive安裝部署

①前提

啓動Hadoop集羣,並在在HDFS上創建/tmp/user/hive/warehouse兩個目錄並修改他們的同組權限可寫

[root@hadoop100 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp
[root@hadoop100 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse
[root@hadoop100 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp
[root@hadoop100 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse

②解壓apache-hive-1.2.1-bin.tar.gz

[root@hadoop100 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/

③修改apache-hive-1.2.1-bin.tar.gz的名稱爲hive-1.2.1

[root@hadoop100 software]$ mv apache-hive-1.2.1-bin/ hive-1.2.1

④複製conf文件夾下的hive-env.sh.templatehive-env.sh

[root@hadoop100 conf]$ cp hive-env.sh.template hive-env.sh

⑤配置hive-env.sh

配置HADOOP_HOME路徑:export HADOOP_HOME=/opt/module/hadoop-2.7.2
配置HIVE_CONF_DIR路徑:export HIVE_CONF_DIR=/opt/module/hive-1.2.1/conf

⑥啓動Hive

[root@hadoop100 hive-1.2.1]$ bin/hive

查看所有數據庫:hive> show databases;

2.2 遇到的問題

打開第二個客戶端窗口啓動hive,會產生java.sql.SQLException異常:

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException:
Unable to instantiate
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
       at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
       at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)
       at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
       at 

原因:Metastore默認存儲在自帶的Derby數據庫中,推薦使用MySQL存儲Metastore

2.3 配置Metastore到MySql

前提:MySQL數據庫的安裝完成

①複製MySQL驅動到Hivelib文件夾下

[root@hadoop100 software]$ cp mysql-connector-java-5.1.27-bin.jar
 /opt/module/hive-1.2.1/lib/

②在conf文件夾下新建hive-site.xml

[root@hadoop100 conf]$ vim hive-site.xml

配置內容爲:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
	  <name>javax.jdo.option.ConnectionURL</name>
	  <value>jdbc:mysql://hadoop100:3306/metastore?createDatabaseIfNotExist=true</value>
	  <description>JDBC connect string for a JDBC metastore</description>
	</property>

	<property>
	  <name>javax.jdo.option.ConnectionDriverName</name>
	  <value>com.mysql.jdbc.Driver</value>
	  <description>Driver class name for a JDBC metastore</description>
	</property>

	<property>
	  <name>javax.jdo.option.ConnectionUserName</name>
	  <value>root</value>
	  <description>username to use against metastore database</description>
	</property>

	<property>
	  <name>javax.jdo.option.ConnectionPassword</name>
	  <value>1234</value>
	  <description>password to use against metastore database</description>
	</property>

</configuration>

③重啓Hive,此時已能多窗口訪問

2.4 HiveJDBC訪問

HiveServer2:

  1. Hive提供了一種允許客戶端遠程訪問的服務
  2. 基於thrift協議,支持跨平臺,跨編程語言對Hive經常訪問
  3. 允許遠程訪問

BeelineHiveServer2支持的新的命令行,基於SQLLine CliJDBC客戶端

①啓動hiveserver2服務

[root@hadoop100 hive-1.2.1]$ bin/hiveserver2

②動beeline

[root@hadoop100 hive-1.2.1]$ bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline>

③連接hiveserver2

beeline> !connect jdbc:hive2://hadoop100:10000(回車)
Connecting to jdbc:hive2://hadoop100:10000
Enter username for jdbc:hive2://hadoop100:10000: rooot(回車)
Enter password for jdbc:hive2://hadoop100:10000: 1234(直接回車)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop100:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
+----------------+--+

2.5 Hive常見屬性配置

Hive數據倉庫位置配置

Default數據倉庫的最原始位置是在hdfs上的:/user/hive/warehouse路徑下。在倉庫目錄下,沒有對默認的數據庫default創建文件夾。如果某張表屬於default數據庫,直接在數據倉庫目錄下創建一個文件夾。

修改數據倉庫位置:配置hive-site.xml

<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive/warehouse</value>
	<description>location of default database for the warehouse</description>
</property>

記得給該文件夾配置同組用戶有執行權限:bin/hdfs dfs -chmod g+w /user/hive/warehouse

②查詢後信息顯示配置

hive-site.xml文件中添加如下配置信息,就可以實現顯示當前數據庫,以及查詢表的頭信息配置。

<property>
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>

<property>
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>

在這裏插入圖片描述
在這裏插入圖片描述
Hive運行日誌信息配置

Hivelog默認存放在/tmp/root/hive.log目錄下(當前用戶名下)

修改日誌位置:配置hive-log4j.properties

hive.log.dir=/opt/module/hive/logs

三、Hive常用交互命令

[root@hadoop100 hive]$ bin/hive -help
usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the console

-e不進入hive的交互窗口執行sql語句

[root@hadoop100 hive]$ bin/hive -e "select * from student;"

②執行文件中的sql語句

[root@hadoop100 hive]$ bin/hive -f /opt/module/datas/hivef.sql

③執行文件中的sql語句並將結果寫入文件中

[root@hadoop100 hive]$ bin/hive -f /opt/module/datas/hivef.sql  > /opt/module/datas/hive_result.txt

④查看在hive中輸入的所有歷史命令

進入到當前用戶的根目錄/root,查看. hivehistory文件

[root@hadoop100 root]$ bin/cat .hivehistory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章