Hive是在HDFS之上的架構,Hive中含有其自身的組件,解釋器、編譯器、執行器、優化器。解釋器用於對腳本進行解釋,編譯器是對高級語言代碼進行編譯,執行器是對java代碼的執行,優化器是在執行過程當中進行優化。這裏的代碼就是Hadoop中的MapReduce,這裏的MapReduce經過Hive往HDFS上執行、分析、查詢數據。html
上圖展現hql的執行過程,一個hql腳本首先到hive的解釋器,轉化爲MapReduce(固然例如「select * from table_name;」這樣的語句不用轉化成MapReduce),解釋器是用於解釋腳本的,MapReduce是由腳本生成的;而後編譯器再對MapReduce程序進行編譯;再而後執行器對代碼的執行以及優化器在執行過程優化。可見,Hive並無更改數據的存儲介質,數據仍然在HDFS上。Hive只是經過MapReduce對數據進行查詢和分析,這時MapReduce不用進行解釋、編譯、優化,hive會幫助完成。這時寫一個MapReduce程序就變成了寫一個hql語句/腳本(或者說相似sql語句/腳本)。java
Hive的本質不是一個數據庫,更不是一個服務,它不須要端口,沒有監聽客戶端。正由於hive不是一個服務,因此不須要考慮HA和分佈式方面的問題,hive實際上就是一種工具,是一種把sql語句轉化成MapReduce,而後再放到hadoop去執行MapReduce的一種工具。能夠將hive理解爲hadoop的一個客戶端,由於是hive去鏈接hdfs,是hive去提交MapReduce程序到hadoop中的ResourceManager主節點。node
hive也有其不足之處。雖然hive能夠替代一部分MapReduce,但只能作統計查詢,以及一些簡單的統計分析,要想作數據挖掘仍需寫MapReduce。由於hive的特色是基於hql腳本進行操做的,它很是接近關係型數據庫的sql語句,因此它的數據結構必定是要有關係的那種才適合統計分析,這種統計分析有侷限性。mysql
從官方文檔中可見,安裝hive須要有jdk1.7(或更高版本)和hadoop2.x或hadoop1.x。可是官網上沒有說須要一個關係型數據庫,實際上hive內嵌了一個關係型數據庫derby。可是內置的derby容量小,有些權限受限,不便於管理。sql
hive必需要有MapReduce和HDFS,也就是要有hadoop集羣。本文不對Apache Hadoop集羣的部署做介紹,這部份內容做者已整理好並將在往後給出。數據庫
hive將hdfs上的數據映射成一種表或字段的結構,在hdfs上分析數據時,其實大部分時候均可以變成一種表結構形式的,或者能夠映射(當作)成一張表,其實不是表,在hdfs上以文件的形式存儲。因此就須要一個存儲映射關係數據的庫,在hive中使用關係型數據庫來存儲hdfs文件與表映射關係的數據,這種數據稱爲元數據。apache
文件的數據如何對應成一張表?須要先查看數據是按什麼分隔符分開的。第一個分隔符的第一個域,表明表中的某個字段,同理第二個域、第三個域、第四個域……都分別表明了表的相應的字段,這是一個一一映射的關係。bash
關係型數據庫的安裝能夠參考做者的另外一篇博文《使用阿里雲主機離線部署CDH步驟詳解》中的安裝MySQL部分。服務器
本文選擇node1安裝MySQL。併爲了能讓node5能鏈接MySQL,須要先添加用戶和權限;另外,還須要爲hive的元數據存儲建立一個數據庫,能夠任意命名。數據結構
進入到MySQL:
mysql>create database hive_metadata;
mysql>grant all on hive_metadata.* to root@'%' identified by '12345678'; mysql>quit;
準備安裝hive的這臺機器必需要有hdfs和ResourceManager的jar包,同時須要hadoop集羣的配置文件。由於在服務器上執行MapReduce時,都須要hadoop的配置文件,並且配置文件要放在classpath路徑下。hive要連hdfs也同樣,由於hdfs是高可用的,不能指定主節點具體是哪臺機器,由於主節點是能夠切換的。因此必需要經過配置文件來配置Zookeeper,配置服務名稱nameservice等。總之,安裝hive的機器上須要有,hadoop的jar包和配置文件(即要有解壓以後的hadoop,配置文件能夠從Hadoop集羣中拷貝),而這臺機器的Hadoop是否運行起來可有可無。
本文的Hadoop集羣是node一、node二、node三、node4,準備安裝hive的機器是node5。
從Index of /apache/hive下載hive,本文使用的是1.2版本。
第一,關閉防火牆。
$ service iptables stop
第二,啓動Zookeeper。
$ zkServer.sh start
第三,啓動hadoop集羣。
$ start-all.sh
第四,單獨啓動RM。
在兩個ResourceManager節點啓動RM
$ yarn-daemon.sh start resourcemanager
第一,上傳。先將下載好的hive包上傳到Linux中。
第二,解壓及軟鏈
$ tar -zxvf apache-hive-1.2.2-bin.tar.gz $ ln -sf /root/apache-hive-1.2.2-bin /home/hive-1.2
第三,確保當前機器有hadoop集羣的配置文件。查看是否有hadoop解壓目錄,若是有要檢查裏面的配置文件是否和hadoop集羣中的一致。因此最好是直接從hadoop集羣的機器中拷貝到當前機器。(當前機器處在hadoop集羣中則無需這一步)。
$vi ~/.bash_profile
export HIVE_HOME=/home/hive-1.2 export PATH=$PATH:$HIEV_HOME/bin
source ~/.bash_profile
hadoop集羣時運行在node1-node4中,而hive在node5,hive是如何鏈接hadoop集羣的?在hive機器上必需要有hadoop的環境變量,若是沒有hive就找不到hadoop的配置文件,也找不到hadoop的jar包,這就不能鏈接hadoop集羣了。
$vi ~/.bash_profile
export HADOOP_HOME=/home/hadoop-2.5 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
$ source ~/.bash_profile
通常不使用hive內置的關係型數據庫derby能夠選擇安裝mysql,並修改配置文件,由於元數據很重要,元數據保存了映射關係。hive的元數據就至關於hdfs的元數據,若是hive的元數據丟失的話,它的表結構就會丟失,這時數據並不會丟失,可是須要從新創建表結構,會浪費不少時間。
修改$HIVE_HOME/conf/hive-default.xml.template配置文件。這個配置文件在默認狀況下沒有啓用,須要先修改文件名。
$ cd $HIVE_HOME/conf/ $ cp hive-default.xml.template hive-site.xml
而後再修改hive-site.xml配置文件中的JDBC的四個屬性:
第一,修改JDBC第一個屬性ConnectionURL
能夠發現其中JDBC的ConnectionURL以下:
其關係型數據庫爲derby,其缺陷有三:一是它的容量小,二是不能跨平臺,三是不能由外部用戶管理,因此要更換。隨意在哪臺機器上安裝mysql,不必定要在hive機器上。
找到javax.jdo.option.ConnectionURL
將其value值改成:jdbc:mysql://node1:3306/hive_metadata
第二,修改JDBC的第二個屬性ConnectionDriverName
找到屬性名爲javax.jdo.option.ConnectionDriverName的位置,將其屬性值修改成:com.mysql.jdbc.Driver,這個驅動實際上就是一個jar包,要放到hive中。
安裝driver驅動。上傳mysql-connector-java-5.1.32.tar.gz到hive機器,解壓,並進入解壓目錄,可見其中有一個jar包mysql-connector-java-5.1.32-bin.jar。注意jar包的版本要和MySQL一致,若是MySQL使用yum安裝,默認安裝的是5.1的。將jar包複製到$HIVE_HOME/lib/中:
$ cp -a mysql-connector-java-5.1.32-bin.jar /home/hive-1.2/lib/
第三,修改JDBC的第三個屬性ConnectionUserName
找到屬性名爲javax.jdo.option.ConnectionUserName的位置,修改其屬性值爲:root。這是剛纔在mysql中建hive_metadata庫時使用的用戶名。
第四,修改JDBC的第四個屬性ConnectionPassword
找到屬性名爲javax.jdo.option.ConnectionPassword的位置,修改其屬性值爲:12345678。這裏的密碼也是對應mysql數據庫中建hive_metadata庫時的密碼。
第五,修改system:java.io.tmpdir路徑。
若是不修改,啓動時會報錯以下 Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D。緣由是裝載不了這個變量所對應的路徑system:java.io.tmpdir。這個路徑是hive的臨時目錄的路徑。因此要修改環境變量,或者修改配置文件中的臨時目錄。
在hive-site.xml中使用/${system:java.io.tmpdir,能夠找到四處。因此能夠將名爲hive.server2.logging.operation.log.location的屬性值改成/tmp/hive/operation_logs;將名爲hive.exec.scratchdir的屬性值改成/tmp/hive;將名爲hive.exec.local.scratchdir的屬性值改成/tmp/hive;將名爲hive.downloaded.resources.dir的屬性值改成/tmp/hive/resources。保存退出。
使用hive便可進入hive的命令行用戶接口。
初次啓動比較慢,是由於在mysql數據庫中,hive會自動在這個剛建立的數據庫hive_metadata中建表,能夠進入node1的mysql中的hive_metadata數據庫中查看。
mysql>use hive_metadata;
mysql>show tables;