天天看點

04_Hive叢集環境搭建

作者:妮唯伊

Hive叢集環境搭建

li_zliang

04_Hive叢集環境搭建

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,下載下傳

04_Hive叢集環境搭建

重點:

問題:Hive安裝在hadoop叢集的哪個節點上?

經查閱,當然網絡資料也少;

從叢集多節點角度來說,hive是分為服務端和用戶端(隻針對“遠端存儲模式”),兩者從安裝來說是一樣的,隻是配置不同:

1. 服務端:有metastore(中繼資料存儲)服務的是指服務端;

2. 用戶端:配置hive.metastore.uris并指向metastore服務的節點都指用戶端。

網絡自行查閱“hive metastore三種配置模式”,簡單解釋下:

  1. 内嵌模式:使用的是内嵌的Derby資料庫來存儲中繼資料,也不需要額外起Metastore服務,這個是預設的,配置簡單,但是一次隻能一個用戶端連接配接,适用于用來實驗,不适用于生産環境;
  2. 本地存儲:采用外部資料庫來存儲中繼資料;hive和metastore服務在同一節點,并不區分所謂的服務端和用戶端;
  3. 遠端存儲:采用外部資料庫來存儲中繼資料;單獨一個節點運作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

04_Hive叢集環境搭建

檢視資料庫,在mysql的hive資料庫裡已生成metadata資料表:

04_Hive叢集環境搭建

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;

04_Hive叢集環境搭建

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

04_Hive叢集環境搭建

7.5 關于配置

hive-site.xml :Hive 的主要配置檔案;關于metastore和hiveserver2的配置,也可以拆分為下述兩個配置檔案:

hivemetastore-site.xml: 關于中繼資料的配置;

hiveserver2-site.xml:關于 HiveServer2 的配置。

繼續閱讀