1. 程式人生 > >Hive總結(一)Hive 2.1.0本地模式搭建教程

Hive總結(一)Hive 2.1.0本地模式搭建教程

零.前言

Apache Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。
Hive有三種執行模式:
1.內嵌模式:將元資料儲存在本地內嵌的Derby資料庫中,這得使用Hive最簡單的方式,不過使用內嵌模式的話,缺點也比較明顯,因為一個內嵌的Derby資料庫每次只能訪問一個數據檔案,這也就意味著不支援多會話連線。這種情況應對本地測試可能都有所不足,僅供初學者熟悉應用Hive;
2.本地模式:這種模式是將元資料庫儲存在本地的獨立資料庫中(比如說MySQL),這樣就能夠支援多會話和多使用者連線;
3.遠端模式:如果我們的Hive客戶端比較多,在每個客戶端都安裝MySQL服務還是會造成一定的冗餘和浪費,這種情況下,就可以更進一步,將MySQL也獨立出來,將元資料儲存在遠端獨立的MySQL服務中。
本文為測試使用,所以搭建的為本地安裝模式。

一.環境配置

hadoop 2.7
jdk 1.8.0
apache-hive-1.1.0-bin.tar.gz

二.安裝mysql

sudo apt-get install mysql-server
安裝過程設定root使用者的密碼
然後進入資料庫增加使用者hive,並且授權
注意先建資料庫,再建立使用者。

create database hive_metastore;
mysql> create user 'hive' identified by '123';
mysql> grant all on *.* TO 'hive'@'%' with grant option;
mysql> flush privileges;

測試登入mysql
開啟 sudo service mysql start
關閉 sudo service mysql stop
重啟 sudo service mysql restart
狀態 sudo service mysql status
登入 mysql -u hive -p
這裡寫圖片描述

三.安裝並配置Hive

1.解壓縮安裝包,並設定hive的使用許可權
2.設定/etc/profile 環境變數,並重新整理儲存
source /etc/profile
3建立臨時IO的tmp檔案檔案,並進行配置,安裝在HDFS上

hadoop fs -mkdir       /tmp/                放hive臨時資料 
hadoop fs -mkdir
/tmp/resources hadoop fs -mkdir /usr/hive/warehouse 放hive資料 hadoop fs -chmod g+w /tmp hadoop fs -chmod g+w /tmp/resources hadoop fs -chmod g+w /user/hive/warehouse

4./conf下更改配置
(1)cp hive-env.sh.template hive-env.sh
增加以下配置

export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive-2.1.0/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive-2.1.0/lib

(2)cp hive-default.xml.template hive-site.xml
[注]該配置中配置較多,需用/字串進行查詢
增加配置

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>資料庫使用者名稱</value>     //hive
    <description>Username to use against metastore database</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>資料庫密碼</value>       //123
    <description>password to use against metastore database</description>
</property>

<property>
<name>hive.exec.local.scratchdir</name>   
#指定HDFS中Hive資料臨時檔案存放目錄,啟動hive,HDFS自動建立。
    <value>/tmp</value>          預設位置
    <description>Local scratch space for Hive jobs</description>
  </property>

<property>
#指定HDFS中Hive資料檔案存放目錄,啟動hive,HDFS自動建立。
    <name>hive.metastore.warehouse.dir</name>
    <value>/usr/hive/warehouse</value>        
    <description>location of default database for the warehouse</description>
  </property>

<property>
<name>hive.downloaded.resources.dir</name>
    <value>/tmp/resources</value>           預設位置
    <description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
    <name>hive.metastore.local</name>
    <value>true</value>
</property>

配置完畢

5.將JDBC複製到Hive庫目錄用於java程式與mysql的連線
下載地址
http://download.softagency.net/MySQL/Downloads/Connector-J/
解壓後將Jar檔案複製轉發
cp mysql-connector-java-5.1.34.jar /usr/local/hive-2.1.0/lib
[注意]用的是5.1,測試用6.0.1時測試失敗。

6.初始化資料庫
schematool -initSchema -dbType mysql
初始化失敗則去資料庫刪除database和使用者,重新建立

mysql -u root -p
密碼
Delete FROM user Where User=’test’ and Host=’localhost’;
flush privileges;
drop database testDB; //刪除使用者的資料庫
刪除賬戶及許可權:
drop user 使用者名稱@’%’;
drop user 使用者名稱@ localhost;

7啟動hadoop然後在bin下鍵入hive
驗證部署成功

8.日誌
hive預設錯誤日誌不線索在console中,日誌儲存在/tmp/user.name>/hive.log資料夾中。

四.job測試Hive叢集

1.本地建立測試檔案

santiago@hdp:~/data$ mkdir hive
santiago@hdp:~/data/hive$ vim hive_text.txt
santi,you are a zhazha.
santiago@hdp:~/data/hive$ cat hive_text.txt
santi,you are a zhazha.

2.

hive> show databases;
OK
default
Time taken: 1.706 seconds, Fetched: 1 row(s)
hive> create table guo_test(Name string,String string)
    > row format delimited
    > fields terminated by ','
    > stored as textfile
    > ;

這裡寫圖片描述

這裡寫圖片描述
是張空表
載入本地資料,並在hive中查該表。是否存入資料。

hive>load data local inpath '/home/santiago/data/hive/hive_test.txt' into table guo_test;
hive> select * from guo_test;
hive>dfs -ls /usr/hive/warehouse/guo_test;  

//表名在hdfs上就形成資料夾
這裡寫圖片描述
這裡寫圖片描述

3觀察HDFS上檔案

#hadoop fs -ls /usr/hive/warehouse
Found 1 items
drwxrwxr-x   - santiago supergroup          0 2017-01-14 21:13
 /usr/hive/warehouse/guo_test

發現hive-site,xml設定的檔案儲存位置中多了guo_test這個資料夾(hive中的表)

#hadoop fs -ls /usr/hive/warehouse/guo_test
Found 1 items
-rwxrwxr-x   1 santiago supergroup         24 2017-01-14 21:13
 /usr/hive/warehouse/guo_test/hive_test.txt  

並在該資料夾中找到了所寫入hive資料倉庫的檔案。
這裡寫圖片描述

附錄一:錯誤分析

錯誤1
Caused by: MetaException(message:Hive metastore database is not initialized. Please use schematool (e.g. ./schematool -initSchema -dbType …) to create the schema. If needed, don’t forget to include the option to auto-create the underlying database in your JDBC connection string (e.g. ?createDatabaseIfNotExist=true for mysql))
解決方案
重啟資料庫 ./schematool -initSchema -dbType mysql
參考:http://blog.csdn.net/beidiqiuren/article/details/53056270

錯誤2
Caused by:
java.net.URISyntaxException:Relative path in absolute URI:
{system:java.io.tmpdir%7D/%7Bsystem:user.name%7D

解決方案
需要建立臨時IO的tmp檔案檔案,並進行配置
mkdir -p tmp/resources
http://宋亞飛.中國/post/36

附錄二:參考文獻