Hive原理及Hive的搭建

Hive簡介

  1. 什麼是Hive
    hive是基於Hadoop的一個數據倉儲工具,可以將結構化的數據文件映射爲一張數據表,並提供SQL查詢功能,可以將SQL語句轉化爲MapReduce任務進行執行。hive是基於Hadoop的一個數據倉儲工具,可以將結構化的數據文件映射爲一張數據表,並提供SQL查詢功能,可以將SQL語句轉化爲MapReduce任務進行執行。
  2. Hive的優點
    學習成本年低,可以通過類SQL語句快速實現簡單的MapReduce統計計算,不必開發專門的MapReduce,十分適合數據倉儲的統計與分析。
  3. Hive的缺點
    雖然用類SQL簡化了操作,但是實際上還是在hdfs上調用了MapReduce,這樣的話,效率還是有所降低的。
  4. Hive數據倉儲與數據庫的區別
    Hive:數據倉儲
    Hive:解釋器、編譯器、優化器等。
    Hive:運行時,元數據存儲在關係型數據庫裏面。

    數據倉儲主要用來保存數據,對數據進行分析計算,一次寫入,多次讀取,不能修改,不能刪除單條數據,除非把整個文件刪除。我們用的修改其實是覆蓋,先把整個文件下載下來,修改後重新上傳。

    Hive的主要功能可以將一條數據轉換爲MapReduce,Hive依賴於HDFS和Yarn。

Hive架構

在這裏插入圖片描述

  • 用戶接口:包括CLI,JDBC/ODBC,web UI
  • 元數據存儲,通常是存儲在關係型數據庫中mysql,derby中
  • 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
  • Hive的真實數據(源數據)存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。

Hive與傳統數據庫進行比較

查詢語言 HQL SQL
數據存儲位置 HDFS 本地FS
數據格式 用戶定義 系統決定
數據更新 不支持 支持
索引 新版本有,但弱
執行 MapReduce Executor
執行延遲
可擴展性
數據規模

Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常爲空格、”\t”、”\x001″)、行分隔符 (”\n”)以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在加載數據的過程中,不需要從用用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。而在數據庫中,不同的數據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,數據庫加載數據的過程會比較耗時。

Hive的搭建

hive三種方式區別和搭建
按照Hive中metastore(元數據存儲)不同位置分爲三種方式:
 a)內嵌Derby方式
 b)Local方式
 c)Remote方式

1,安裝Hive

	解壓下載好的apache-hive-1.2.1-bin.tar.gz安裝包到 /opt/apache-hive-1.2.1目錄下
	tar -zxvf apache-hive-1.2.1-bin.tar.gz /opt/apache-hive-1.2.1

2,配置環境變量

export HIVE_HOME=/opt/apache-hive-1.2.1
export PATH=$HIVE_HOME/bin:$PATH

3,三種方式的搭建(配置文件的不同)
①Derby方式
修改hive-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

./hive

注意:將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下

這種模式的弊端
使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會提示如下錯誤

[html] view plaincopyprint?
hive> show tables;  
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 	   
'metastore_db', see the next exception for details.  
NestedThrowables:  
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.  
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask  
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 	
'metastore_db', see the next exception for details.		 
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

②Local(mysql)方式

這種存儲方式需要在本地運行一個mysql服務器,並作如下配置(下面兩種使用mysql的方式,需要將	
mysql的jar包拷貝到$HIVE_HOME/lib目錄下)。 
即是hive和mysql都配置在客戶端

修改hive-site.xml,配置如下

<configuration>  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive_meta/warehouse</value>  
</property>     
<property>  
 <name>hive.metastore.local</name>  
  <value>true</value>  
</property>   
<property>  
 <name>javax.jdo.option.ConnectionURL</name>  
 <value>jdbc:mysql://192.168.23.129/hive_remote?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>123456</value>  
</property>  
</configuration> 

注意一個坑:
權限,雖然hive用戶對hive_meta數據庫是由操作權限的,但是這個數據庫如果不存在,hive用戶也是沒有權限創建這個數據庫,所以需要提前創建好hive_remote數據庫

安裝mysql

Yum install mysql-server -y

修改mysql權限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
flush privileges;

刪除多餘會對權限造成影響的數據
刷新權限

添加用戶:
CREATE USER 'hive'@'%' IDENTIFIED BY '123';
授權用戶:
grant all privileges on hive_meta.* to hive@"%" identified by '123';
flush privileges;
設置開機啓動
chkconfig mysqld on

注意每次修改後要刷新權限,否則不起作用

配置過程中出現的錯誤

[ERROR] Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
at jline.TerminalFactory.create(TerminalFactory.java:101)

錯誤的原因: Hadoop jline版本和hive的jline不一致

③多用戶模式

將hive-site.xml配置文件拆爲如下兩部分

服務端配置文件

<configuration>  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive/warehouse</value>  
</property> 
<property>  
  <name>javax.jdo.option.ConnectionURL</name>  
  <value>jdbc:mysql://192.168.57.6:3306/hive?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>root</value>  
</property>  
<property>  
  <name>javax.jdo.option.ConnectionPassword</name>  
  <value>123456</value>  
</property>  
</configuration>  

客戶端配置文件

<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.57.5:9083</value>  
</property>  
</configuration>  

啓動hive服務端程序

 hive --service metastore
 或者,上面的那條語句執行比較慢,可以採用下面的讓他在後臺啓動
 ./hive --service metastore >> meta.log 2>&1 &
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章