一、Hive概述
1.1 hive概念
Hive是基于Hadoop的一個資料倉庫工具,可以将結構化的資料檔案映射為一張表,并
提供類SQL查詢功能。
本質是:将HQL轉化成MapReduce程式
1)Hive處理的資料存儲在HDFS;
2)Hive分析資料底層的實作是MapReduce;
3)執行程式運作在Yarn上。
1.2 hive優缺點分析
優點:
1)操作接口采用類SQL文法,提供快速開發的能力(簡單、容易上手)
2)避免了去寫MapReduce,減少開發人員的學習成本。
3)Hive的執行延遲比較高,是以Hive常用于資料分析,對實時性要求不高的場合;
4)Hive優勢在于處理大資料,對于處理小資料沒有優勢,因為Hive的執行延遲比較高。
5)Hive支援使用者自定義函數,使用者可以根據自己的需求來實作自己的函數。
缺點:
1)Hive的HQL表達能力有限
(1)疊代式算法無法表達
(2)資料挖掘方面不擅長
2)Hive的效率比較低
(1)Hive自動生成的MapReduce作業,
- List item
通常情況下不夠智能
(2)Hive調優比較困難,粒度較粗
1.3 hive架構原理
如圖中所示,Hive通過給使用者提供的一系列互動接口,接收到使用者的指令(SQL),使用自己的Driver,結合中繼資料(MetaStore),将這些指令翻譯成MapReduce,送出到Hadoop中執行,最後,将執行傳回的結果輸出到使用者互動接口。
1)使用者接口:Client
CLI(hive shell)、JDBC/ODBC(java通路hive)、WEBUI(浏覽器通路hive)
2)中繼資料:Metastore
中繼資料包括:表名、表所屬的資料庫(預設是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的資料所在目錄等;
預設存儲在自帶的derby資料庫中,由于存在derby資料庫中無法實作hive的多開,是以推薦使用MySQL存儲Metastore
3)Hadoop
使用HDFS進行存儲,使用MapReduce進行計算。
4)驅動器:Driver
(1)解析器(SQL Parser):将SQL字元串轉換成抽象文法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行文法分析,比如表是否存在、字段是否存在、SQL語義是否有誤。
(2)編譯器(Physical Plan):将AST編譯生成邏輯執行計劃。
(3)優化器(Query Optimizer):對邏輯執行計劃進行優化。
(4)執行器(Execution):把邏輯執行計劃轉換成可以運作的實體計劃。對于Hive來
說,就是MR/Spark。
1.4 hive與資料庫的差別
Hive采用了類似SQL的查詢語言HQL(Hive Query Language),但從結構上來看,Hive和資料庫除了擁有類似的查詢語言,再無類似之處。資料庫可以用在Online的應用中,但是Hive是為資料倉庫而設計的。
類别 | 差別 |
---|---|
查詢語言 | SQL被廣泛的應用在資料倉庫中; 針對Hive的特性設計了類SQL的 |
資料存儲位置 | Hive資料存儲在HDFS中; 資料庫則将資料儲存在塊裝置或者本地檔案系統中。 |
資料更新 | Hive是針對資料倉庫應用設計的,是讀多寫少的;是以,Hive中所有的資料都是在加載的時候确定好的。 而資料庫中可以使用INSERTINTO…VALUES添加資料,使用UPDATE…SET修改資料。 |
索引 | Hive在加載資料的過程中不會對資料進行任何處理,甚至不會對資料進行掃描,是以也沒有對資料中的某些Key建立索引; |
執行 | Hive中大多數查詢的執行是通過Hadoop提供的MR來實作的; 而資料庫通常有自己的執行引擎。 |
執行延遲 | Hive由于利用MR架構且沒有索引,查詢時需要掃描整個表,是以延遲較高; |
可擴充性 | Hive的可擴充性是和Hadoop的可擴充性是一緻的; 資料庫由于ACID語義的嚴格限制,擴充行非常有限。 |
資料規模 | Hive建立在叢集上并可以利用MapReduce進行并行計算,可以支援很大規模的資料; 資料庫可以支援的資料規模較小。 |
二、Hive安裝及部署
2.1 下載下傳位址
Hive官網位址:
http://hive.apache.org/
文檔檢視位址:
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
下載下傳位址:
http://archive.apache.org/dist/hive/
github位址:
https://github.com/apache/hive
2.2 安裝部署
2.2.1 hive 安裝
(1)把apache-hive-1.2.1-bin.tar.gz上傳到linux的/opt/software目錄下
(2)解壓apache-hive-1.2.1-bin.tar.gz到/opt/module/目錄下面
[[email protected] software]# tar-zxvf apache-hive-1.2.1-bin.tar.gz-C /opt/module/
(3)修改apache-hive-1.2.1-bin.tar.gz的名稱為hive
[[email protected] module]# mv apache-hive-1.2.1-bin/ hive
(4)修改/opt/module/hive/conf目錄下的hive-env.sh.template名稱為hive-env.sh
[[email protected] conf]# mvhive-env.sh.template hive-env.sh
(5)配置hive-env.sh檔案
(a)配置HADOOP_HOME路徑
(b)配置HIVE_CONF_DIR路徑
2.2.2 hadoop配置
第一步:啟動hdfs、yarn;
第二步:建立相應檔案夾
/tmp 用于 存儲
/user/hive/warehouse 存儲資料倉庫檔案
2.2.3 Hive中繼資料配置到Mysql
驅動拷貝
1)在/opt/software/mysql-libs目錄下解壓mysql-connector-java-5.1.27.tar.gz驅動包
[[email protected] mysql-libs]# tar-zxvf mysql-connector-java-5.1.27.tar.gz
2)拷貝/opt/software/mysql-libs/mysql-connector-java-5.1.27目錄下的
mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/
[[email protected] mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar
/opt/module/hive/lib/
配置Metastore到MySql
1)在/opt/module/hive/conf目錄下建立一個hive-site.xml
[[email protected] conf]# touch hive-site.xml
[[email protected] conf]# vi hive-site.xml
2)根據官方文檔配置參數,拷貝資料到hive-site.xml檔案中。
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" ?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--指定HDFS中虛拟機的位址-->
<value>jdbc:mysql://hadoop2: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>
<!--指定Mysql登陸使用者名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<!--指定Mysql登陸密碼-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>000000</value>
<description>password to use against metastore database</description>
</property>
<!--指定HIVE中是否顯示表的名稱-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
</configuration>
三、常用操作指令
3.1 互動指令
1)“-e”不進入hive的互動視窗執行sql語句
[[email protected] hive]# bin/hive-e "select id from student;"
2)“-f”執行腳本中sql語句
(1)在/opt/module/datas目錄下建立hivef.sql檔案
[[email protected] datas]# touch hivef.sql
檔案中寫入正确的sql語句
(2)執行檔案中的sql語句
[[email protected] hive]# bin/hive -f /opt/module/datas/hivef.sql
(3)執行檔案中的sql語句并将結果寫入檔案中
[[email protected] hive]# bin/hive-f /opt/module/datas/hivef.sql >/opt/module/datas/hive_result.txt
3.2 其他指令
1)退出hive視窗:
hive(default)>exit;
hive(default)>quit;
在新版的oracle中沒差別了,在以前的版本是有的:
exit:先隐性送出資料,再退出;
quit:不送出資料,退出;
2)在hive cli指令視窗中如何檢視hdfs檔案系統
hive(default)>dfs-ls /;
3)在hive cli指令視窗中如何檢視hdfs本地系統
hive(default)>!ls /opt/module/datas;
4)檢視在hive中輸入的所有曆史指令
(1)進入到目前使用者的根目錄/root或/home/atguigu
(2)檢視. hivehistory檔案
cat .hivehistory