大資料筆記08--Hive原理和搭建
阿新 • • 發佈:2018-12-17
什麼是Hive
hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。
Hive的架構
架構圖
架構描述
- 使用者介面主要有三個:CLI,Client 和 WUI。
- 其中最常用的是CLI,Cli啟動的時候,會同時啟動一個Hive副本。
- Client是Hive的客戶端,使用者連線至Hive Server。在啟動 Client模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。
- WUI是通過瀏覽器訪問Hive。
- Hive將元資料儲存在資料庫中,如mysql、derby。 Hive中的元資料包括:表的名字、表的欄位名和型別、分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄、行分隔符,欄位分隔符。
- 直譯器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃(策略選擇、消耗模型)的生成。生成的查詢計劃儲存在HDFS中,並在隨後有MapReduce呼叫執行。
- Hive的資料儲存在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。
hql解析
ANTLR詞法語法分析工具解析hql
搭建Hive
本地方式(內嵌derby)
步驟
- 解壓
- 修改安裝包內conf資料夾下的hive-default.xml.template,並重命名為hite-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property >
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
- 將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下,並將原jar包刪除或改名令其失效。 否則會報版本不匹配的錯誤
問題
使用derby儲存方式時,執行hive會在當前目錄生成一個derby檔案和一個metastore_db目錄。 這種儲存方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用資料庫,多個使用者登入時會報錯。 (這是由於derby資料庫的侷限性造成的)
Local(mysql)
這種儲存方式需要在本地執行一個mysql伺服器,並作如下配置
步驟
- 安裝一個mysql資料庫
yum install mysql-server -y
- 拷貝mysql驅動包到$HIVE_HOME\lib目錄下
- 修改hive-site,xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive_meta?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
</property>
</configuration>
- 啟動sql服務
service mysqld start
設定開機啟動
chkconfig mysqld on
- 修改root使用者許可權
#登入mysql
mysql -uroot
#修改許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
#重新整理
flush privileges;
- 新增使用者並修改許可權
#建立hive使用者和密碼
CREATE USER 'hive'@'%' IDENTIFIED BY '123';
#賦予許可權
grant all privileges on hive_meta.* to [email protected]"%" identified by '123';
flush privileges;
- 刪除多餘許可權
#進入mysql資料庫
use mysql;
#檢視使用者
select host,user,password from user;
#刪除多餘會對許可權造成影響的資料
delete from user where...
- 將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下
- 配置HIVE_HOME,hive啟動
問題
注意一個坑: 許可權,雖然hive使用者對hive_meta資料庫是由操作許可權的,但是這個資料庫如果不存在,hive使用者也是沒有許可權建立這個資料庫,所以需要提前建立好hive_meta資料庫
遠端(remote)模式
當有多個客戶端使用hive時,若使用各自本地的hive和mysql,會導致各端元資料不一致,不易於管理,可能會出現各種問題。 在一個基於本地mysql資料庫的hive作為服務端,啟動一個metastore服務,其他客戶端通過thrift協議連線metastore使用服務端hive,從而使用同一份mysql內的元資料。
步驟
- 在一個搭建好基於mysql的hive的節點啟動metastore服務作為服務端
hive --service metastore
- 在客戶端解壓安裝包並修改hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.23.134:9083</value>
</property>
</configuration>
- 拷貝jline的jar包以及配置HIVE_HOME(同上)
- hive啟動
問題
- metastore的啟動會一直啟動在前臺,可利用如下方法解決
hive --service metastore >> meta.log 2>&1 &
#將日誌列印到meta.log 錯誤日誌(2)重定向到正常日誌(1)
&表示後臺執行
- 這種方式服務端只提供元資料,客戶端執行自己的hive