1. 程式人生 > >Apache Hive 基本理論與安裝指南

Apache Hive 基本理論與安裝指南

scratch 建表 username apach 而且 use res isp 自動

一、Hive的基本理論

  Hive是在HDFS之上的架構,Hive中含有其自身的組件,解釋器、編譯器、執行器、優化器。解釋器用於對腳本進行解釋,編譯器是對高級語言代碼進行編譯,執行器是對java代碼的執行,優化器是在執行過程中進行優化。這裏的代碼就是Hadoop中的MapReduce,這裏的MapReduce通過Hive往HDFS上執行、分析、查詢數據。

技術分享圖片

  上圖展示hql的執行過程,一個hql腳本首先到hive的解釋器,轉化為MapReduce(當然例如“select * from table_name;”這樣的語句不用轉化成MapReduce),解釋器是用於解釋腳本的,MapReduce是由腳本生成的;然後編譯器再對MapReduce程序進行編譯;再然後執行器對代碼的執行以及優化器在執行過程優化。可見,Hive並沒有更改數據的存儲介質,數據仍然在HDFS上。Hive只是通過MapReduce對數據進行查詢和分析,這時MapReduce不用進行解釋、編譯、優化,hive會幫助完成。這時寫一個MapReduce程序就變成了寫一個hql語句/腳本(或者說類似sql語句/腳本)。

  Hive的本質不是一個數據庫,更不是一個服務,它不需要端口,沒有監聽客戶端。正因為hive不是一個服務,所以不需要考慮HA和分布式方面的問題,hive實際上就是一種工具,是一種把sql語句轉化成MapReduce,然後再放到hadoop去執行MapReduce的一種工具。可以將hive理解為hadoop的一個客戶端,因為是hive去連接hdfs,是hive去提交MapReduce程序到hadoop中的ResourceManager主節點。

  hive也有其不足之處。雖然hive可以替代一部分MapReduce,但只能做統計查詢,以及一些簡單的統計分析,要想做數據挖掘仍需寫MapReduce。因為hive的特點是基於hql腳本進行操作的,它非常接近關系型數據庫的sql語句,所以它的數據結構一定是要有關系的那種才適合統計分析,這種統計分析有局限性。

二、Hive的安裝

1. 環境的準備

  從官方文檔中可見,安裝hive需要有jdk1.7(或更高版本)和hadoop2.x或hadoop1.x。但是官網上沒有說需要一個關系型數據庫,實際上hive內嵌了一個關系型數據庫derby。但是內置的derby容量小,有些權限受限,不便於管理。

  • Hadoop集群

  hive必須要有MapReduce和HDFS,也就是要有hadoop集群。本文不對Apache Hadoop集群的部署作介紹,這部分內容作者已整理好並將在日後給出。

  • 關系型數據庫MySQL

  hive將hdfs上的數據映射成一種表或字段的結構,在hdfs上分析數據時,其實大部分時候都可以變成一種表結構形式的,或者可以映射(當做)成一張表,其實不是表,在hdfs上以文件的形式存儲。所以就需要一個存儲映射關系數據的庫,在hive中使用關系型數據庫來存儲hdfs文件與表映射關系的數據,這種數據稱為元數據。

  文件的數據如何對應成一張表?需要先查看數據是按什麽分隔符分開的。第一個分隔符的第一個域,代表表中的某個字段,同理第二個域、第三個域、第四個域……都分別代表了表的相應的字段,這是一個一一映射的關系。

  關系型數據庫的安裝可以參考作者的另一篇博文《使用阿裏雲主機離線部署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機器上要有Hadoop的jar包和配置文件

  準備安裝hive的這臺機器必須要有hdfs和ResourceManager的jar包,同時需要hadoop集群的配置文件。因為在服務器上執行MapReduce時,都需要hadoop的配置文件,而且配置文件要放在classpath路徑下。hive要連hdfs也一樣,因為hdfs是高可用的,不能指定主節點具體是哪臺機器,因為主節點是可以切換的。所以必須要通過配置文件來配置Zookeeper,配置服務名稱nameservice等。總之,安裝hive的機器上需要有,hadoop的jar包和配置文件(即要有解壓之後的hadoop,配置文件可以從Hadoop集群中拷貝),而這臺機器的Hadoop是否運行起來無關緊要。

2. hive的安裝

  本文的Hadoop集群是node1、node2、node3、node4,準備安裝hive的機器是node5。

  • hive的下載

  從Index of /apache/hive下載hive,本文使用的是1.2版本。

  • 啟動Hadoop集群

  第一,關閉防火墻。

$ 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集群中則無需這一步)。

  • 在hive機器node5上配置hive的環境變量
$vi ~/.bash_profile
export HIVE_HOME=/home/hive-1.2
export PATH=$PATH:$HIEV_HOME/bin
source ~/.bash_profile
  • 在hive機器node5上配置Hadoop的環境變量

  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實際上已經可以運行了。在命令行中輸入hive,就可以打開hive的命令行用戶接口,在裏面就可以敲sql語句了。(第一次打開比較耗時,因為它會檢查hadoop、關系型數據庫是否有問題)。由於目前還沒有把hdfs上的文件映射到關系型數據庫的表,所以這時的hive還沒有表的概念。
  • 設置關系型數據庫

  一般不使用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/apache-hive-1.2.1-bin/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即可進入hive的命令行用戶接口。

  初次啟動比較慢,是因為在mysql數據庫中,hive會自動在這個剛創建的數據庫hive_metadata中建表,可以進入node1的mysql中的hive_metadata數據庫中查看。

mysql>use hive_metadata;
mysql>show tables;

技術分享圖片

Apache Hive 基本理論與安裝指南