Hive叢集環境搭建
li_zliang
1 前提準備
1.1 虛機環境
1.2 JDK1.8
1.3 Hive安裝包
1.4 hadoop叢集
1.5 MySQL 8
2 部署規劃
3 安裝配置
3.1 搭建hadoop叢集(略)
3.2 安裝MySQL資料庫(略)
3.3 安裝Hive(master)
3.4 配置環境變量(master)
3.5 建立HDFS目錄(master)
3.6 修改配置(master)
3.6.1 hive-env.sh
3.6.2 hive-site.xml
3.6.2 hive-log4j2.properties
3.7 拷貝驅動(master)
3.8 分發程式(msater)
3.9 配置環境變量(slave1+slave2)
3.10 修改配置(slave2)
4 啟動關閉
4.1 初始化
4.2 啟動
4.3 關閉
5 Hive HUI
6 問題
6.1 問題1
6.2 問題2
7 HiveServer2
7.1 關于
7.2 配置
7.2.1 hadoop core-site.xml(master+slave1+slave2)
7.2.2 hive hive-site.xml(master+slave1)
7.2.3 Web UI(master+slave1)
7.3 啟動hiveserver2(master+slave1)
7.4 使用beeline(master+slave1+slave2)
7.5 關于配置
Apache:http://www.apache.org/
關于hadoop、HSQL、Hive等相關資訊均在官方網站中找到;
WEBGUI:Hive用戶端提供了一種通過網頁的方式通路Hive所提供的服務。這個接口對應Hive的HWI元件(Hive Web Interface),生産環境可用Hue元件代替,下圖為Hue界面。
1 前提準備
1.1 虛機環境
這裡搭建一個 3 節點的 Hadoop 叢集;我這裡準備了三台CentOS 7;用VMware搭建;
計算機名分别 為A-CentOS7(master)、B-CentOS7(slave1)、C-CentOS7(Slave2);
1.2 JDK1.8
hadoop依賴JDK,提前安裝好JDK;
1.3 Hive安裝包
http://hive.apache.org/downloads.html自行下載下傳;apache-hive-2.3.9-bin.tar.gz
1.4 hadoop叢集
安裝hive前提是要先安裝hadoop叢集;詳見前述筆記;
1.5 MySQL 8
采用MySQL8作為meta存儲,提前安裝好MySQL,可以和hive在同一節點,也可以單獨安裝;
這裡采用了單獨的伺服器作為存儲;具體安裝詳見前述筆記;
資料庫驅動
https://dev.mysql.com/downloads/connector/j/,下載下傳mysql驅動;這裡使用的MySQL8,下載下傳
重點:
問題:Hive安裝在hadoop叢集的哪個節點上?
經查閱,當然網絡資料也少;
從叢集多節點角度來說,hive是分為服務端和用戶端(隻針對“遠端存儲模式”),兩者從安裝來說是一樣的,隻是配置不同:
1. 服務端:有metastore(中繼資料存儲)服務的是指服務端;
2. 用戶端:配置hive.metastore.uris并指向metastore服務的節點都指用戶端。
網絡自行查閱“hive metastore三種配置模式”,簡單解釋下:
- 内嵌模式:使用的是内嵌的Derby資料庫來存儲中繼資料,也不需要額外起Metastore服務,這個是預設的,配置簡單,但是一次隻能一個用戶端連接配接,适用于用來實驗,不适用于生産環境;
- 本地存儲:采用外部資料庫來存儲中繼資料;hive和metastore服務在同一節點,并不區分所謂的服務端和用戶端;
- 遠端存儲:采用外部資料庫來存儲中繼資料;單獨一個節點運作metastore服務(服務端),然後每個用戶端都在配置檔案裡配置連接配接到該metastore服務;
綜上:
1. 隻有所謂的遠端存儲模式區分Hive服務端(節點A)和用戶端(節點BCD..),内嵌模式和本地存儲是針對單節點而言;
2. 資料庫存儲中繼資料,metastore服務節點連接配接資料庫,用戶端節點連接配接metastore服務;metastore統一從資料庫來存取中繼資料;
3. 存儲中繼資料資料庫1個,連接配接資料庫的metastore服務節點可以多個,連接配接metastore服務的用戶端節點可以多個;
總結:
Hive安裝在hadoop叢集的哪個節點上完全由自己決定; 建議:所有namenode上安裝Hive作為服務端,datanode上安裝Hive作為用戶端;
對于普通叢集,需要在master節點(單個)安裝Hive并啟動metastore服務作為服務端,其他節點安裝Hive作為用戶端;
對于HA叢集,需要在namenode節點(多個)安裝Hive并啟動metastore服務作為服務端,其他datanode節點安裝Hive作為用戶端;
問題:Hive安裝運作是否要啟動Hadoop?
雖然修改配置檔案并不需要你把hadoop跑起來,但是用到了hadoop指令,在執行這些指令前你必須確定hadoop是在正常跑着的,而且啟動hive的前提也是需要hadoop在正常跑着,是以建議你先将hadoop跑起來在按照本文操作。
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration
2 部署規劃
meta存儲MySQL伺服器:msa-db-mysql
目前Hadoop叢集是 基于zookeeper的HA叢集;其中hadoop-master和hadoop-slave1是namenode;hadoop-master、hadoop-slave1、hadoop-slave2,是以:
centos7-db-mysql 192.168.25.221:mysql8
hadoop-master 192.168.25.100:hive + metastore
hadoop-slave1 192.168.25.102:hive + metastore
hadoop-slave2 192.168.25.103:hive
3 安裝配置
3.1 搭建hadoop叢集(略)
普通叢集也好,基于zookeeper的HA叢集也行;這裡是基于zookeeper的HA叢集;
3.2 安裝MySQL資料庫(略)
MySQL可以安裝到任意伺服器;這裡單獨部署了一個伺服器;
安裝的是MySQL8.0.25,并建立了名為hive的資料庫,建了hive/Cvicse#2021的使用者;
3.3 安裝Hive(master)
将apache-hive-2.3.9-bin.tar.gz上傳至/home目錄,安裝在/usr/local/hive目錄,将apache-hive-2.3.9-bin.tar.gz複制進去并解壓;
> mkdir /usr/local/hive
> cp /home/apache-hive-2.3.9-bin.tar.gz /usr/local/hive/
> cd /usr/local/hive/
> tar -zvxf apache-hive-2.3.9-bin.tar.gz
// 注意我這裡解壓後apache-hive-2.3.9-bin目錄所有者變了,不知為什麼;這裡改為root
> chown -R root:root /usr/local/hive/apache-hive-2.3.9-bin
3.4 配置環境變量(master)
> vim /etc/profile
//添加環境變量:
export HIVE_HOME=/usr/local/hive/apache-hive-2.3.9-bin
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=${HIVE_HOME}/bin:$PATH
//使得配置的環境變量立即生效:
> source /etc/profile
3.5 建立HDFS目錄(master)
Hive配置檔案裡要用到HDFS的一些路徑,需要先手動建立:
> hadoop fs -mkdir -p /hive/warehouse
> hadoop fs -mkdir -p /hive/temp
> hadoop fs -mkdir -p /hive/log
> hadoop fs -chmod -R 777 /hive/warehouse
> hadoop fs -chmod -R 777 /hive/temp
> hadoop fs -chmod -R 777 /hive/log
> hadoop fs -ls /hive/warehouse
> hadoop fs -ls /hive/temp
> hadoop fs -ls /hive/log
在主機上建立,會自動分發到其他主機;
但是需要注意的是,權限不會同步;是以要在slave1和slave2上再次執行:
> hadoop fs -chmod -R 777 /hive/warehouse
> hadoop fs -chmod -R 777 /hive/temp
> hadoop fs -chmod -R 777 /hive/log
3.6 修改配置(master)
3.6.1 hive-env.sh
進入安裝目錄下的 conf/ 目錄,拷貝 Hive 的環境配置模闆 flume-env.sh.template
> cd $HIVE_HOME/conf
> cp hive-env.sh.template hive-env.sh
> vi hive-env.sh
修改 hive-env.sh:
//指定 Hadoop 的安裝路徑
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.10.1
//指定Hive配置檔案路徑
export HIVE_CONF_DIR=/usr/local/hive/apache-hive-2.3.9-bin/conf
//指定Hive的lib路徑
export HIVE_AUX_JARS_PATH=/usr/local/hive/apache-hive-2.3.9-bin/lib
3.6.2 hive-site.xml
目錄中沒有hive-site,是以建立 hive-site.xml 檔案,内容如下,主要是配置存放中繼資料的 MySQL 的位址、驅動、使用者名和密碼等資訊:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.25.221:3306/hive?createDatabaseIfNotExist=true&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true</value>
</property>
<!--在hive0.10版本上删除這個屬性;如果hive.metastore.uris屬性為空,則預設為本地模式,否則為遠端模式-->
<!--
<property>
<name>hive.metastore.local</name> //本地模式
<value>true</value>
</property>
-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Cvicse#2021</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/hive/temp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/hive/log</value>
</property>
</configuration>
3.6.2 hive-log4j2.properties
建立目錄:
> mkdir /usr/local/hive/apache-hive-2.3.9-bin/logs
修改配置hive-log4j.properties
> cd $HIVE_HOME/conf
> cp hive-log4j2.properties.template hive-log4j2.properties
> vi hive-log4j2.properties
修改下屬性
property.hive.log.dir=/usr/local/live/apache-hive-2.3.9-bin/logs
3.7 拷貝驅動(master)
将 MySQL 驅動包mysql-connector-java-8.0.26.jar上傳至/home目錄,并複制進 Hive 安裝目錄的 lib 目錄下;
> cp /home/mysql-connector-java-8.0.26.jar $HIVE_HOME/lib
3.8 分發程式(msater)
将 Hive 安裝包分發到其他兩台伺服器;
# hadoop-slave1 和 hadoop-slave2分别建立目錄
> mkdir /usr/local/hive/
# 将安裝包分發到hadoop-slave1
> scp -r /usr/local/hive/* hadoop-slave1:/usr/local/hive/
# 将安裝包分發到hadoop-slave2
> scp -r /usr/local/hive/* hadoop-slave2:/usr/local/hive/
# 總之從機的hadoop_home路徑與主機保持一緻;
3.9 配置環境變量(slave1+slave2)
在hadoop-slave1 和 hadoop-slave2上分别配置環境變量;
> vim /etc/profile
//添加環境變量:
export HIVE_HOME=/usr/local/hive/apache-hive-2.3.9-bin
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=${HIVE_HOME}/bin:$PATH
//使得配置的環境變量立即生效:
> source /etc/profile
3.10 修改配置(slave2)
根據部署規劃,hadoop-msater和hadoop-slave1為server端, hadoop-slave2為client端;
是以需要修改hadoop-slave2上的配置檔案;
修改:hive-site.xml
> cd $HIVE_HOME/conf
> vi hive-site.xml
#增加下述配置:
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop-master:9083,hadoop-slave1:9083</value>
</property>
4 啟動關閉
4.1 初始化
當使用的 hive 是 1.x 版本時,可以不進行初始化操作,Hive 會在第一次啟動的時候會自動進行初始化,但不會生成所有的中繼資料資訊表,隻會初始化必要的一部分,在之後的使用中用到其餘表時會自動建立;
當使用的 hive 是 2.x 版本時,必須手動初始化中繼資料庫。初始化指令:
應該在三台主機上均運作下述指令;
# schematool 指令在安裝目錄的 bin 目錄下,由于上面已經配置過環境變量,在任意位置執行即可
schematool -dbType mysql -initSchema
在第一個主機master運作成功後,在第二個主機slave1或者第三個主機slave2上運作時出現下述錯誤:
Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
是因為,資料庫已經已經初始化建好表,在第二主機上再次初始化時,也會再次建表,就沖突了;
解決辦法是,清空資料庫中的表,在第二個主機上執行初始化指令;再清空資料庫中的表,在第三個主機上執行初始化指令;
4.2 啟動
由于已經将 Hive 的 bin 目錄配置到環境變量,直接使用以下指令啟動,成功進入互動式指令行後執行show databases 指令,無異常則代表搭建成功。
hadoop-master和hadoop-slave1上執行hive --service metastore啟動metastore服務(服務端):
hive metastore 服務端啟動指令:
hive --service metastore -p <port>
//啟動metastore服務,關閉SSH後,服務也會關閉;
> hive --service metastore
//背景啟動metastore服務,是以要用背景啟動;
> nohup hive --service metastore 2>&1 >$HIVE_HOME/bin/nohup_metastore.out &
hive> show databases
hadoop-master、hadoop-slave1、hadoop-slave2上執行(用戶端)hive,啟動Hive CLI;
因為在3台機器上都安裝了hive,并且作了相關的配置,所有3台機器均可以啟動Hive CLI(Hive互動式shell);
> hive
hive> show databases
檢視資料庫,在mysql的hive資料庫裡已生成metadata資料表:
4.3 關閉
怎麼關閉metastore服務:
> ps -ef | grep hive
> kill -9 程序号
5 Hive HUI
hive的web ui,并不實用,這裡就不贅述了;
6 問題
6.1 問題1
在第三個主機上執行show databases;時出現下述異常,
Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
經分析:
1. 服務端metastore服務可能沒有啟動,我最初啟動metastore并沒有采用背景啟動,且關閉過SSH,導緻服務關閉;改為背景啟動後,執行;
2. 第三個主機沒有初始化,參考<4.1 初始化>章節,每個主機都初始化,但切換主機初始化時注意要删除表;
6.2 問題2
啟動時出現:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/apache-hive-2.3.9-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hadoop-2.10.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
錯誤原因:
hive和hadoop中的SLF4J的jar包重複了
在兩個中的位置分别如下:
- $HIVE_HOME/lib/log4j-slf4j-impl-2.6.2.jar
- $HADOOP_HOME/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar
解決辦法:
删除任意一個即可,這裡删除log4j-slf4j-impl-2.6.2.jar
cd $HIVE_HOME/lib/
cp log4j-slf4j-impl-2.6.2.jar log4j-slf4j-impl-2.6.2.jar.yyyymmdd
rm -rf log4j-slf4j-impl-2.6.2.jar
其實更建議保留版本高版本。
7 HiveServer2
7.1 關于
在hive中有metaStore與hiveServer2兩種服務,這兩種其實都是基于thrift服務;
AdminManual Configuration
metaStore:
是用來通路中繼資料的;用戶端連接配接metastore服務,metastore再去連接配接MySQL資料庫來存取中繼資料;
hiverserver2:
一般來講是是用來通路資料的;hiveServer(不能處理多個用戶端的并發請求)的更新版;hiveServer2支援多用戶端并發通路和身份驗證;旨在為開放API用戶端(如JDBC和ODBC)提供更好的支援;
HiveServer2
hive cli:
指運作hive指令進行操作;LanguageManual Cli
bin/hive --通路--> metaStore server --通路-->MySQL HiveServer2 Clients
beeline:
hiverserver2的cli工具;
beeline --通路-->hiveServer2 --通路--> metaStore server --通路--> MySQL
Hive CLI 已經不推薦使用了,官方更加推薦使用 Beeline;
7.2 配置
7.2.1 hadoop core-site.xml(master+slave1+slave2)
修改 hadoop 叢集的 core-site.xml 配置檔案,增加如下配置,指定 hadoop 的 root 使用者可以代理本機上所有的使用者;
是因為 hadoop 2.0 以後引入了安全僞裝機制,使得 hadoop 不允許上層系統(如 hive)直接将實際使用者傳遞到 hadoop 層,而應該将實際使用者傳遞給一個超級代理,由該代理在hadoop 上執行操作,以避免任意用戶端随意操作 hadoop。如果不配置這一步,在之後的連接配接中可能會抛出 AuthorizationException 異常;
> cd $HADOOP_HOME/etc/hadoop/
> vi core-site.xml
增加下述配置:
# 增加允許用來連接配接hiveserver2的username,這裡為root
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
7.2.2 hive hive-site.xml(master+slave1)
> cd $HIVE_HOME/conf
> vi hive-site.xml
增加下述配置:
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop-master</value> <!--slave1上配置為hadoop-slave1-->
</property>
可以在TCP模式或HTTP模式下運作HiveServer2,但不能同時運作這兩種模式:
TCP模式:上面配置即為TCP模式;
設定 | 預設 | 描述 |
hive.server2.thrift.min.worker.threads | 5 | 工作線程的最小數量 |
hive.server2.thrift.max.worker.threads | 500 | 最大工作線程數 |
hive.server2.thrift.port | 偵聽的TCP端口号 | |
hive.server2.thrift.bind.host | 綁定到的TCP接口 |
HTTP模式:
設定 | 預設 | 描述 |
hive.server2.transport.mode | binary | 設定為http以啟用HTTP傳輸模式 |
hive.server2.thrift.http.port | 10001 | 要監聽的HTTP端口号 |
hive.server2.thrift.http.max.worker.threads | 500 | 伺服器池中的最大工作線程數 |
hive.server2.thrift.http.min.worker.threads | 5 | 伺服器池中的最小工作線程數 |
hive.server2.thrift.http.path | cliservice | 服務端點(service endpoint) |
還有一些其他配置,如基于Cookie的認證、日志配置、認證/安全、臨時目錄等;自行查閱,不再贅述;
7.2.3 Web UI(master+slave1)
在Hive 2.0.0中引入,HiveServer2的Web使用者界面(UI)提供配置,日志記錄,名額和活動會話資訊。
預設情況下,Web UI在端口10002(127.0.0.1:10002);
<property>
<name>hive.server2.webui.host</name>
<value>hadoop-master</value> <!--slave1上配置為hadoop-slave1-->
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
啟動後通路http://hadoop-master:10002;
7.3 啟動hiveserver2(master+slave1)
//啟動 hiveserver2,關閉SSH後,服務也會關閉;
nopup hive --service hiveserver2
//背景啟動hiveserver2服務,是以要用背景啟動;
> nohup hive --service hiveserver2 2>&1 >$HIVE_HOME/bin/nohup_hiveserver2.out &
7.4 使用beeline(master+slave1+slave2)
在任意節點上,可以使用以下指令進入 beeline 互動式指令行,出現 Connected 則代表連接配接成功:
# beeline -u jdbc:hive2://hadoop-master:10000 -n root
# beeline -u jdbc:hive2://hadoop-slave1:10000 -n root
7.5 關于配置
hive-site.xml :Hive 的主要配置檔案;關于metastore和hiveserver2的配置,也可以拆分為下述兩個配置檔案:
hivemetastore-site.xml: 關于中繼資料的配置;
hiveserver2-site.xml:關于 HiveServer2 的配置。