文章目錄
一、Hive簡介
1.1 Hive概述
Hive
是由Facebook
開源用於解決海量結構化日誌的數據統計。
Hive
是基於Hadoop
的一個數據倉庫工具,可以將結構化的文件數據映射爲一張表,並提供類SQL查詢功能。
Hive
本質就是將HQL
轉換爲MapReduce
程序,其處理的數據存儲在HDFS
,分析數據底層的實現是MapReduce
,執行程序運行在Yarn
上。
1.2 Hive的優缺點
優點:
- 操作接口採用類
SQL
語法,提供快速開發的能力(簡單、容易上手) - 避免了去寫
MapReduce
,減少開發人員的學習成本 Hive
的執行延遲比較高,因此Hive
常用於數據分析,對實時性要求不高的場合Hive
優勢在於處理大數據,對於處理小數據沒有優勢,因爲Hive
的執行延遲比較高Hive
支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數
缺點:
- Hive的HQL表達能力有限:迭代式算法無法表達;數據挖掘方面不擅長,由於
MapReduce
數據處理流程的限制,效率更高的算法卻無法實現。 - Hive的效率比較低:
Hive
自動生成的MapReduce
作業,通常情況下不夠智能化;Hive
調優比較困難,粒度較粗。
1.3 Hive架構原理
Hive
通過給用戶提供的一系列交互接口,接收到用戶的指令(SQL
),使用自己的Driver
,結合元數據(MetaStore
),將這些指令翻譯成MapReduce
,提交到Hadoop
中執行,最後,將執行返回的結果輸出到用戶交互接口。
- 用戶接口:Client
CLI
(command-line interface
)、JDBC
/ODBC
(JDBC
訪問Hive
)、WEBUI
(瀏覽器訪問Hive
) - 元數據:Metastore
元數據包括:表名、表所屬的數據庫(默認是default
)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;
默認存儲在自帶的Derby
數據庫中,推薦使用MySQL
存儲Metastore
- Hadoop
使用HDFS
進行存儲,使用MapReduce
進行計算 - 驅動器: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.template
爲hive-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
驅動到Hive
下lib
文件夾下
[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:
- 爲
Hive
提供了一種允許客戶端遠程訪問的服務 - 基於
thrift
協議,支持跨平臺,跨編程語言對Hive
經常訪問 - 允許遠程訪問
Beeline:HiveServer2
支持的新的命令行,基於SQLLine Cli
的JDBC
客戶端
①啓動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
運行日誌信息配置
Hive
的log
默認存放在/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