1. 程式人生 > >大資料筆記08--Hive原理和搭建

大資料筆記08--Hive原理和搭建

什麼是Hive

hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。

Hive的架構

架構圖

在這裡插入圖片描述

架構描述

  1. 使用者介面主要有三個:CLI,Client 和 WUI。
  • 其中最常用的是CLI,Cli啟動的時候,會同時啟動一個Hive副本。
  • Client是Hive的客戶端,使用者連線至Hive Server。在啟動 Client模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。
  • WUI是通過瀏覽器訪問Hive。
  1. Hive將元資料儲存在資料庫中,如mysql、derby。 Hive中的元資料包括:表的名字、表的欄位名和型別、分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄、行分隔符,欄位分隔符。
  2. 直譯器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃(策略選擇、消耗模型)的生成。生成的查詢計劃儲存在HDFS中,並在隨後有MapReduce呼叫執行。
  3. Hive的資料儲存在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。

hql解析

ANTLR詞法語法分析工具解析hql 在這裡插入圖片描述

搭建Hive

本地方式(內嵌derby)

步驟

  1. 解壓
  2. 修改安裝包內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>
  1. 將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下,並將原jar包刪除或改名令其失效。 否則會報版本不匹配的錯誤

問題

使用derby儲存方式時,執行hive會在當前目錄生成一個derby檔案和一個metastore_db目錄。 這種儲存方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用資料庫,多個使用者登入時會報錯。 (這是由於derby資料庫的侷限性造成的)

Local(mysql)

這種儲存方式需要在本地執行一個mysql伺服器,並作如下配置

步驟

  1. 安裝一個mysql資料庫
yum  install mysql-server -y

  1. 拷貝mysql驅動包到$HIVE_HOME\lib目錄下 在這裡插入圖片描述
  2. 修改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> 
  1. 啟動sql服務
service mysqld start

設定開機啟動
chkconfig mysqld on
  1. 修改root使用者許可權
#登入mysql
mysql -uroot

#修改許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;

#重新整理
flush privileges; 
  1. 新增使用者並修改許可權
#建立hive使用者和密碼
CREATE USER 'hive'@'%' IDENTIFIED BY '123';

#賦予許可權
grant all privileges on hive_meta.* to [email protected]"%" identified by '123';
flush privileges; 
  1. 刪除多餘許可權
#進入mysql資料庫
use mysql;

#檢視使用者
select host,user,password from user;

#刪除多餘會對許可權造成影響的資料
delete from user where...
  1. 將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下
  2. 配置HIVE_HOME,hive啟動

問題

注意一個坑: 許可權,雖然hive使用者對hive_meta資料庫是由操作許可權的,但是這個資料庫如果不存在,hive使用者也是沒有許可權建立這個資料庫,所以需要提前建立好hive_meta資料庫

遠端(remote)模式

當有多個客戶端使用hive時,若使用各自本地的hive和mysql,會導致各端元資料不一致,不易於管理,可能會出現各種問題。 在一個基於本地mysql資料庫的hive作為服務端,啟動一個metastore服務,其他客戶端通過thrift協議連線metastore使用服務端hive,從而使用同一份mysql內的元資料。

步驟

  1. 在一個搭建好基於mysql的hive的節點啟動metastore服務作為服務端
hive --service metastore  
  1. 在客戶端解壓安裝包並修改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>  
  1. 拷貝jline的jar包以及配置HIVE_HOME(同上)
  2. hive啟動

問題

  • metastore的啟動會一直啟動在前臺,可利用如下方法解決
hive --service metastore >> meta.log 2>&1 &

#將日誌列印到meta.log 錯誤日誌(2)重定向到正常日誌(1) 
&表示後臺執行
  • 這種方式服務端只提供元資料,客戶端執行自己的hive