1. 程式人生 > >Hadoop之Hive的安裝與配置

Hadoop之Hive的安裝與配置

Hive目前底層還是用MapReduce,以後可能會用Spark,Tez。Hive差不多是一個查詢介面,你的SQL語句還是會翻譯成MapReduce任務的,你用explain就可以看到這些任務的執行計劃。下面介紹下hive的基礎安裝過程以及簡單的使用。

環境資訊:

虛擬機器數量:3臺
作業系統:Ubuntu 14.04
實驗環境及版本:
Hadoop:Hadoop 2.2.0
Java:java version "1.7.0_51"
Hive:apache-hive-1.2.1
MySQL:mysql  Ver 14.14 Distrib 5.5.44(x86_64)

安裝Hive之前首先要確保hadoop叢集搭建成功

(1)Hive版本使用
版本:apache-hive-1.2.1-bin.tar.gz
上傳至叢集中的master機器中,並解壓使用命令:

# tar -xvf apache-hive-1.2.1-bin.tar.gz

(2)配置環境變數

# vim /etc/profile

export HIVE_HOME=/hadoop/hive
export CLASSPATH=.:${HIVE_HOME}/lib:$CLASSPATH
export PATH=${HIVE_HOME}/bin:${HIVE_HOME}/conf:$PATH

# source /etc/profile

此時Hive已經可以使用


優化Hive

預設meta資料庫為derby ,為了避免使用預設的Derby資料庫(有併發訪問和效能的問題),通常還需要配置元資料庫為MySQL的操作。

1)修改在Hive目錄下conf中修改xml配置

root@master:conf# pwd
/qh/src/hive/conf
root@master:conf# cp hive-default.xml.template hive-site.xml
root@master:conf# cp hive-log4j.properties.template hive-log4j.properties

Hive配置檔案
即:把幾個帶.template字尾的模板檔案,複製一份變成不帶.template的配置檔案,注意hive-default.xml.template這個要複製二份,一個是hive-default.xml,另一個是hive-site.xml,其中hive-site.xml為使用者自定義配置,hive-default.xml為全域性配置,hive啟動時,-site.xml自定義配置會覆蓋-default.xml全域性配置的相同配置項。

2)檔案配置hive-site.xml

# vim hive-site.xml
<property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
 </property>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
  </property>

  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/user/hive/downloaded</value>
  </property>

  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/user/hive/scratchdir</value>
  </property>

hive.exec.local.scratchdir和hive.downloaded.resources.dir
這二項對應的目錄,是指本地目錄(必須先手動建好)

root@master:conf# mkdir -p /user/hive/scratchdir
root@master:conf# mkdir -p /user/hive/downloaded

hive.exec.scratchdir和hive.metastore.warehouse.dir
這兩項目錄為hdfs中的目錄(hive啟動時,會自動建好,如果自動建立失敗,也可以手動通過shell在hdfs中建立

hadoop fs -mkdir -p /tmp/hive
hadoop fs -mkdir -p /user/hive/warehouse

3)檔案配置hive-log4j.properties

#vim hive-log4j.properties
hive.log.dir=/user/hive/log/${user.name}

這個是當hive執行時,相應的日誌文件儲存到什麼地方

hive.log.file=hive.log

這個是hive日誌檔案的名字是什麼
預設的就可以,只要您能認出是日誌就好,其目錄要手動建立,命令為:

root@master:conf# mkdir -p /user/hive/log

4)替換hadoop 2.2.0中的jline jar包
由於hive 1.2.0自帶的jline包跟hadoop 2.2.0自帶的版本不一致,因此需要將$HIVE_HOME/lib/jline-2.12.jar 這個檔案替換掉$HADOOP_HOME/share/hadoop/yarn/lib 下原來的版本 (即:將舊版本刪除,複製新版本到此目錄),否則hive啟動將失敗


配置MySQL儲存Hive元資料

1)MySQL儲存配置
此種模式下是將hive的metadata儲存在Mysql中,
Mysql的執行環境支撐雙向同步或是叢集工作環境,
這樣的話,至少兩臺資料庫伺服器上會備份hive的元資料。
既然在derby模式下的hive已經能夠成功執行。
確保安裝MySql,若安裝跳過此步驟(apt-get install mysql-server
資料庫中授權

# mysql -u root -p
mysql> create user 'hive'@'%' identified by 'hive';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION;
mysql> flush privileges;

之後,在目錄/etc/mysql下找到my.cnf,用vim編輯,找到my.cnf裡面的bind-address = 127.0.0.1將其註釋。

mysql> use mysql;
mysql> select host, user from user;
mysql> create database hive;
mysql> use hive;
mysql> show variables like 'character_set_%';
mysql> alter database hive character set latin1;

(否則在建表的時候看Hive後臺日誌,報錯,前臺不執行)

重啟mysql服務程式碼如下:

# /etc/init.d/mysql stop
# /etc/init.d/mysql start

2)檔案配置hive-site.xml

# vim hive-site.xml
 <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://192.168.60.61:3306/hive</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>

3)MySQL 驅動包
下載mysql-connector-java-5.1.18-bin.jar檔案,並放到$HIVE_HOME/lib目錄下

# wget http://downloads.mysql.com/archives/mysql-connector-java-5.0/mysql-connector-java-5.0.8.tar.gz .

解壓:

# tar -zxvf mysql-connector-java-5.0.8.tar.gz 

將mysql-connector-java-5.0.8-bin.jar拷貝到hive lib目錄下:

# cp mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar  ./lib

啟動Hive

root@master:/# hive

實驗程式碼測試Hive
1、Hive訪問
(1)直接執行sql語句

# hive -e 'select * from t1'

靜音模式:

# hive -S -e 'select * from t1' 

(用法與第一種方式的靜音模式一樣,不會顯示mapreduce的操作過程)
匯出資料到Linux本地目錄:

# hive -e 'select * from t1' > test.txt

從檔案中執行Hive查詢:

# hive -f /tmp/queries.hql

在Hive shell中可以使用source命令來執行一個指令碼檔案:

# cat /tmp/queries.hql
select * from mytable limit 1;
# hive      -- 啟動Hive
hive> source /tmp/queries.hql;

(Hive的指令碼中註釋使用 –)

執行shell命令:
使用者不需要退出hive cli就可以執行簡單的bash shell命令。只要在命令前加上!並且以分號(;)結尾就可以。

hive> ! /bin/echo "hello, world!";
"hello, world";

(2)Hive啟動WEB
具體配置如下:
需要下載一個hwi.war包,採用去原始碼中找到hwi/web/包

# tar -zxvf apache-hive-1.2.1-src.tar.gz
# cd apache-hive-1.2.1-src/hwi
# jar cvfM0 hive-hwi-my.war -C web/ .
# mv hive-hwi-my.war /qh/src/hive/lib/hive-hwi-my.war

檔案配置

# cd $HIVE_HOME/conf
# vim hive-site.xml

圖1-5-1-1 Hive啟動WEB配置

# hive --service hwi

開啟該模式後,可通過瀏覽器對Hive進行操作

http://192.168.60.61:9999/hwi/

(配置Hive機器IP:埠)

(3)CLI訪問(直接使用Hive互動式模式)

# hive     --啟動
hive> quit;     --退出hive
hive> show databases;   --檢視資料庫
hive> create database test;  --建立資料庫
hive> use default;    --使用哪個資料庫
hive> create table t1 (key string); --建立表

或:
使用過程中出錯採用

# hive -hiveconf hive.root.logger=DEBUG,console   //重啟除錯

(4)Hive 遠端服務 (埠號10000) 啟動方式:
用Java等程式實現通過JDBC等驅動的訪問Hive就用這種起動方式

# hiveserver2 start

(則啟動hiveserver2的使用者為hive,執行mapreduce的使用者也為hive,如果沒有hive使用者,則不能使用)
(停止服務:clt+c)

# hive --service hiveserver2 --hiveconf hive.server2.thrift.port=10001 &    --後臺啟動

(則啟動hive-server2的使用者為root,執行mapreduce的使用者也為root)
(停止服務:clt+c)
或,通過檢視程序# ps -ef | grep hive
然後使用# kill -9 程序號

2、Hive簡單語句

hive> CREATE TABLE pokes (foo INT, bar STRING);
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
hive> SHOW TABLES;                             
hive> DESCRIBE pokes;

Hive簡單例子

(1)準備資料集

root@master:/# vim /home/hiveclass/input/easyhive_5_1.txt

測試資料
這裡寫圖片描述

(2)上傳至Hadoop叢集

root@master:/# hadoop fs -put /home/hiveclass/input/easyhive_5_1.txt   /hiveclass/input

(3)建立easyhive_5_1_1表

hive> create table easyhive_5_1_1(id int);

(4)將hdfs中的檔案內容載入到表中

hive> load data inpath '/hiveclass/input/easyhive_5_1.txt' into table easyhive_5_1_1;

(5)測試求平均值

hive> select avg(id) from easyhive_5_1_1;

圖1-5-3-2 Hive執行結果
這裡寫圖片描述