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執行結果