事無鉅細 Hive1.2.1 Hiveserver搭建詳解
上文介紹了Hadoop2.6.4叢集搭建的詳細步驟。現在我們在此基礎上,搭建Hiveserver。同樣,事無鉅細,難免跑題。
環境需求列表
- Hive1.2版本開始,依賴Java1.7+,0.14-1.1版本依賴Java1.6+。推薦用Java1.8
- 推薦使用Hadoop2.x 系列。Hive2.0開始不再支援Hadoop1.x系列。0.13版之前的Hive也仍支援Hadoop0.20.x和0.23.x系列。
- 在生產環境下推薦使用Linux或Windows系統。Mac系統僅推薦在試驗環境使用。
下載安裝Hive
下載Hive安裝包
wget http://mirrors.cnnic.cn/apache/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz
解壓到當前使用者目錄下(我的安裝包都下載在使用者的download的目錄下。)
tar -xzvf apache-hive-1.2.1-bin.tar.gz -C ~/
強迫症,改個和Hadoop統一的名字。
mv apache-hive-1.2.1-bin/ hive-1.2.1
設定環境變數
需要配置HIVE_HOME和HIVE_BIN
vim ~/.bashrc
修改內容如下:
export HIVE_HOME=$HOME/hive-1.2.1
export PATH=$PATH:$HOME/bin:$HIVE_HOME/binsour
立即生效
source ~/.bashrc
Metadata Store MySQL安裝
Hive有三種元資料儲存的模式。
- Embedded mode
- Local mode
- Remote mode
很多文章裡都有介紹,但是很少有人具體解釋其區別和原理。OneCoder很不滿意,這裡找到一篇介紹,至少對我來說,算是能看懂他所介紹的。 Metastore Deployment Modes
這裡採用Remote mode。因此我們先要部署MySQL。
安裝MySQL5.7.12
下載
wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-server-5.7.12-1.el6.x86_64.rpm
安裝
sudo rpm -i mysql-community-server-5.7.12-1.el6.x86_64.rpm
發現缺少依賴
mysql-community-common-5.7.12、mysql-community-client-5.7.12和mysql-community-libs-5.7.12
下載依賴:
wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-common-5.7.12-1.el6.x86_64.rpm
wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-client-5.7.12-1.el6.x86_64.rpm
wget http://repo.mysql.com/yum/mysql-5.7-community/el/6/x86_64/mysql-community-libs-5.7.12-1.el6.x86_64.rpm
賦予可執行許可權
chmod 700 mysql-community-*
安裝依賴
sudo rpm -i mysql-community-libs-5.7.12-1.el6.x86_64.rpm
sudo rpm -i mysql-community-common-5.7.12-1.el6.x86_64.rpm
sudo rpm -i mysql-community-client-5.7.12-1.el6.x86_64.rpm
安裝MySQL
sudo rpm -i mysql-community-server-5.7.12-1.el6.x86_64.rpm
建立自己的MySQL資料目錄,在當前使用者的主目錄下執行
mkdir -p metastore-mysql/data
mkdir -p metastore-mysql/logs
賦予許可權,由於mysql實際是使用mysql使用者啟動服務。而我們的資料目錄改在了dps-hadoop使用者的根目錄下,所以得從根上,給mysql使用者以RX許可權
sudo chmod -R 755 /home/dps-hadoop
修改my.cnf配置檔案
vim /etc/my.cnf
內容如下
[mysqld]
datadir=/home/dps-hadoop/metastore-mysql/data
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
log-error=/home/dps-hadoop/mysqllog/mysqld.log
pid-file=/home/dps-hadoop/metastore-mysql/data/mysqld.pid
[mysql]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
[mysqladmin]
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
datadir=/home/dps-hadoop/metastore-mysql/data
socket=/home/dps-hadoop/metastore-mysql/data/mysql.sock
log-error=/home/dps-hadoop/mysqllog/mysqld.log
其中log-error對應的路徑需要提前建立,而datadir路徑會自動建立。
關閉Selinux,否則會因為無法建立資料目錄而報錯。
setenforce 0
啟動mysql
sudo service mysqld start
在啟動日誌裡會發現root使用者的臨時密碼: qkkmgd.Np0?N 登入後修改密碼即可。
mysql -u root -p
建立資料庫hive
mysql> create database hive;
建立hive使用者並授權
mysql> grant all on hive.* to [email protected]'%' identified by '密碼';
配置Hive
Hive在conf目錄下提供了一個配置檔案模版hive-default.xml.template供我們修改。而Hive會預設載入hive-site.xml配置檔案。因此,拷貝一份。
cp conf/hive-default.xml.template conf/hive-site.xml
同樣,按照了解,我們需要配置metastore的相關資訊,如資料庫連線,驅動,使用者名稱,密碼等。
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>資料庫密碼</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false;</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>hive.metastore.uris</name>
<value>thrift://master:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
這裡,metastore服務的預設埠為9083。
還需要配置本地資料倉庫路徑
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/home/dps-hadoop/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
由於我們需要連線MySQL資料庫,而Hive並沒有提供相應的驅動,所以需要下載MySQL JDBC驅動,並放在Hive的lib目錄下。直接進入lib目錄執行
wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
修改log日誌檔案位置
Hive預設將日誌存放在/tmp/${user.name}下。為了方便維護和檢視,修改日誌檔案位置。
cp conf/hive-log4j.properties.template conf/hive-log4j.properties
修改
hive.log.dir=/home/dps-hadoop/logs/hive
啟動HiveServer服務
啟動MetaStore Service
bin/hive --service metastore &
啟動HiveServer
bin/hive --service hiveserver2 &
檢視日誌一切正常。
驗證Hive客戶端
bin/hive
發現報錯
Exception in thread “main” java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
這是由於jline的版本衝突,在hadoop的lib帶的版本低。解決辦法,修改hive-env.sh
vim conf/hive-env.sh
新增
export HADOOP_USER_CLASSPATH_FIRST=true
即用hive裡的高版本覆蓋Hadoop裡的低版本。
再次啟動客戶端,一切OK。通過beeline客戶端驗證也ok。至此Hiveserver2部署完成。