天天看點

數倉 Hive HA 介紹與實戰操作

作者:大資料老司機

一、概述

在資料倉庫中,Hive HA(High Availability) 是指為 Apache Hive 這個資料倉庫查詢和分析工具提供高可用性的架構和解決方案。Hive是建立在Hadoop生态系統之上的一種資料倉庫解決方案,用于處理大規模資料的查詢和分析。為了確定Hive服務的連續性和可用性,特别是在出現硬體故障、軟體問題或其他中斷情況時,實施Hive的高可用性解決方案非常重要。

Hive HA通常涉及以下幾個方面:

  • 中繼資料存儲的高可用性 : 中繼資料存儲在Hive Metastore中,其中包括表的結構、分區資訊、表的位置等。為了確定中繼資料的高可用性,可以使用資料庫複制、備份和恢複政策。常見的資料庫選擇包括MySQL、PostgreSQL等。
  • 查詢引擎的高可用性: Hive的查詢引擎可以采用多種方式實作高可用性,例如使用Hadoop的YARN資料總管來管理查詢作業,或者通過部署多個Hive Server來實作負載均衡和故障轉移。
  • 資料存儲的備援備份: 在Hadoop HDFS中存儲的資料可以通過資料備援備份來確定資料的可靠性和高可用性。HDFS通常使用副本機制來儲存多個資料副本,以防止單個節點故障導緻資料丢失。
  • 自動故障切換: Hive HA解決方案應該能夠自動檢測到故障,并在需要時進行故障切換。這意味着當一個節點或服務出現問題時,系統能夠迅速将請求路由到可用的節點或服務上,進而減少中斷時間。
  • 監控和告警系統: 為了實作高可用性,監控和告警系統對于及時發現和處理故障非常重要。這些系統可以監視Hive服務的運作狀态,及時發出警報并采取必要的措施來應對潛在的問題。

總的來說,Hive HA旨在通過備援、備份、自動故障切換和監控系統等方式,確定在各種情況下都能夠保持Hive服務的正常運作,進而提供持續的資料查詢和分析能力。具體的實施方式可能因組織的需求和技術棧而異。

數倉 Hive HA 介紹與實戰操作

二、Hive MetaStore HA 介紹與配置

Hive MetaStore HA(High Availability)是為了保證Hive中繼資料存儲的高可用性而采取的一系列措施和配置。Hive中繼資料存儲在MetaStore中,包括表的定義、分區、表的屬性等資訊。確定Hive MetaStore的高可用性是保障整個Hive系統可靠性和穩定性的重要一步。

正常連接配接原理:

數倉 Hive HA 介紹與實戰操作

高可用原理:

數倉 Hive HA 介紹與實戰操作

以下是一個示例,将 ZooKeeper 位址配置到 hive.metastore.uris 中:

<configuration>
  <property>
 	<name>hive.server2.thrift.bind.host</name>
  	<value>metastore1_host</value>
  </property>
  
  <!-- 啟用 ZooKeeper 用于 HA -->
  <property>
    <name>hive.metastore.uris</name>
    <value>
      thrift://metastore1_host:9083,
      thrift://metastore2_host:9083
    </value>
  </property>
  <!-- 其他配置項 -->
</configuration>
           

在這個示例中,你需要将 metastore1_host、metastore2_host、metastore3_host 替換為你的 Hive MetaStore 執行個體的主機位址。使用逗号分隔來指定多個位址。這樣,當連接配接到一個執行個體時出現問題,Hive 将嘗試連接配接到下一個位址,以實作故障切換和備援。

三、Hive HiveServer2 HA 介紹與配置

HiveServer2 HA(High Availability)是為了確定Apache Hive的查詢服務HiveServer2的高可用性而采取的一系列措施和配置。HiveServer2是Hive的一個查詢引擎,允許使用者通過多種方式(如JDBC、ODBC等)送出和執行Hive查詢。通過配置HiveServer2的高可用性,可以確定在出現硬體故障、軟體問題或其他中斷情況時仍然能夠提供持續的查詢服務。
數倉 Hive HA 介紹與實戰操作

以下是一個示例HiveServer2的高可用性配置,使用Apache ZooKeeper來實作故障切換。請注意,這隻是一個簡化的示例,實際配置可能會因環境和需求而有所不同。

  1. 安裝和配置ZooKeeper:確定你已經安裝和配置了一個ZooKeeper叢集。你需要知道ZooKeeper伺服器的主機名或IP位址以及端口号。
  2. 編輯Hive Site配置:打開Hive的配置檔案 hive-site.xml,添加以下屬性來配置HiveServer2的高可用性和與ZooKeeper的內建:
<configuration>
  <!-- 啟用ZooKeeper用于HA -->
  <property>
    <name>hive.server2.zookeeper.namespace</name>
    <value>hiveserver2</value>
  </property>
  <property>
    <name>hive.zookeeper.client.port</name>
    <value>2181</value>
  </property>
  <property>
    <name>hive.zookeeper.quorum</name>
    <value>zk1_host:2181,zk2_host:2181,zk3_host:2181</value>
  </property>
  <property>
    <name>hive.server2.support.dynamic.service.discovery</name>
    <value>true</value>
  </property>
  <!-- 其他配置項 -->
</configuration>
           

将zk1_host、zk2_host、zk3_host替換為你的ZooKeeper主機位址和端口号。

四、環境部署

這裡為了快速部署環境,就使用k8s 環境部署Hadoop了。關于 hadoop on k8s 教程,可關注我公衆号:大資料與雲原生技術分享 擷取教程。

hive-site.xml 完整配置如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<!-- 配置hdfs存儲目錄 -->
	<property>
			<name>hive.metastore.warehouse.dir</name>
			<value>/user/hive_remote/warehouse</value>
	</property>

	<property>
			<name>hive.metastore.local</name>
			<value>false</value>
	</property>

	<!-- 所連接配接的 MySQL 資料庫的位址,hive_local是資料庫,程式會自動建立,自定義就行 -->
	<property>
			<name>javax.jdo.option.ConnectionURL</name>
			<value>jdbc:mysql://192.168.182.110:13306/hive_metastore?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=Asia/Shanghai</value>
	</property>

	<!-- MySQL 驅動 -->
	<property>
			<name>javax.jdo.option.ConnectionDriverName</name>
			<!--<value>com.mysql.cj.jdbc.Driver</value>-->
			<value>com.mysql.jdbc.Driver</value>
	</property>

	<!-- mysql連接配接使用者 -->
	<property>
			<name>javax.jdo.option.ConnectionUserName</name>
			<value>root</value>
	</property>

	<!-- mysql連接配接密碼 -->
	<property>
			<name>javax.jdo.option.ConnectionPassword</name>
			<value>123456</value>
	</property>

	<!--中繼資料是否校驗-->
	<property>
			<name>hive.metastore.schema.verification</name>
			<value>false</value>
	</property>

	<property>
			<name>system:user.name</name>
			<value>root</value>
			<description>user name</description>
	</property>

	<property>
			<name>hive.metastore.uris</name>
			<value>thrift://{{ include "hadoop.fullname" . }}-hive-metastore-0.{{ include "hadoop.fullname" . }}-hive-metastore:{{ .Values.service.hive.metastore.port }},{{ include "hadoop.fullname" . }}-hive-metastore-1.{{ include "hadoop.fullname" . }}-hive-metastore:{{ .Values.service.hive.metastore.port }}</value>
	</property>

	<!-- host -->
	<property>
			<name>hive.server2.thrift.bind.host</name>
			<value>0.0.0.0</value>
			<description>Bind host on which to run the HiveServer2 Thrift service.</description>
	</property>

	<!-- hs2端口 預設是10000-->
	<property>
			<name>hive.server2.thrift.port</name>
			<value>{{ .Values.service.hive.hiveserver2.port }}</value>
	</property>
	
	<!-- 啟用ZooKeeper用于HA -->
	<!--設定hiveserver2的命名空間-->
	<property>
			<name>hive.server2.zookeeper.namespace</name>
			<value>hiveserver2</value>
	</property>

	<!--指定zk的端口,這個其實是否可以去掉,因為hive.server2.zookeeper.quorum 配置裡有配置端口的-->
	<property>
			<name>hive.zookeeper.client.port</name>
			<value>2181</value>
	</property>

	<!--設定zk叢集的用戶端位址-->
	<property>
			<name>hive.zookeeper.quorum</name>
			<value>{{ include "hadoop.fullname" . }}-zookeeper-0.{{ include "hadoop.fullname" . }}-zookeeper.{{ .Release.Namespace }}.svc.cluster.local:2181,{{ include "hadoop.fullname" . }}-zookeeper-1.{{ include "hadoop.fullname" . }}-zookeeper.{{ .Release.Namespace }}.svc.cluster.local:2181,{{ include "hadoop.fullname" . }}-zookeeper-2.{{ include "hadoop.fullname" . }}-zookeeper.{{ .Release.Namespace }}.svc.cluster.local:2181</value>
	</property>

	<!-- 用于啟用或禁用 HiveServer2 動态服務發現功能。-->
	<property>
			<name>hive.server2.support.dynamic.service.discovery</name>
			<value>true</value>
	</property>

</configuration>
           
【溫馨提示】如果不是使用 hadoop on k8s 方式部署,記得修改 javax.jdo.option.ConnectionURL、hive.metastore.uris、hive.server2.zookeeper.quorum 這幾個配置的值。

開始部署

cd hadoop-ha-on-kubernetes
#mkdir -p /opt/bigdata/servers/hadoop/{nn,jn,dn,zk}/data/data{1..3}
#chmod 777 -R /opt/bigdata/servers/hadoop/
# 安裝
helm install hadoop-ha ./ -n hadoop-ha --create-namespace

# 檢視
kubectl get pods,svc -n hadoop-ha -owide

# 更新
# helm upgrade hadoop-ha ./ -n hadoop-ha

# 解除安裝
# helm uninstall hadoop-ha -n hadoop-ha
#rm -fr /opt/bigdata/servers/hadoop/*
           
數倉 Hive HA 介紹與實戰操作

五、測試驗證

1)hive metastore 測試驗證

hive_pod_name=`kubectl get pods -n hadoop-ha|grep 'hiveserver2'|head -1 |awk '{print $1}'`

# 登入pod 
kubectl exec -it $hive_pod_name -n hadoop-ha -- bash

# 啟動指令,
hive 

create database test2023;
create table test2023.person_local_1(id int,name string,age int) row format delimited fields terminated by ',';
# 檢視表結構
show create table test2023.person_local_1;

drop table test2023.person_local_1;
drop database test2023;

# 指定具體metastore,不指定就是查詢可用的metastore服務
# 互動式
SET hive.metastore.uris=thrift://hadoop-ha-hadoop-hive-metastore-0.hadoop-ha-hadoop-hive-metastore:9083;

# 非互動式
hive --hiveconf hive.metastore.uris=thrift://hadoop-ha-hadoop-hive-metastore-0.hadoop-ha-hadoop-hive-metastore:9083 -e "show databases;"
           

2)hive hiveserver2 測試驗證

hive_pod_name=`kubectl get pods -n hadoop-ha|grep 'hiveserver2'|head -1 |awk '{print $1}'`

# 登入pod 
kubectl exec -it $hive_pod_name -n hadoop-ha -- bash

# 非互動式,這裡我使用svc通路,當然你也可以展開,寫具體的pod或IP
beeline -u "jdbc:hive2://hadoop-ha-hadoop-zookeeper.hadoop-ha:2181/;serviceDiscoveryMode=zookeeper;zookeeperNamespace=hiveserver2/default" -n hadoop -e "select version();"

# 互動式操作
beeline -u "jdbc:hive2://hadoop-ha-hadoop-zookeeper.hadoop-ha:2181/;serviceDiscoveryMode=zookeeper;zookeeperNamespace=hiveserver2/default" -n hadoop

--- 1、建立表
create table person_local_1(id int,name string,age int) row format delimited fields terminated by ',';
create table person_hdfs_1(id int,name string,age int) row format delimited fields terminated by ',';
show tables;

--- 2、 從local加載資料,這裡的local是指hs2服務所在機器的本地linux檔案系統
load data local inpath '/opt/bigdata/hadoop/data/hive-data' into table person_local_1;

--- 3、查詢
select * from person_local_1;

--- 4、從hdfs中加載資料,這裡是移動,會把hdfs上的檔案mv到對應的hive的目錄下
load data inpath '/person_hdfs.txt'  into table person_hdfs_1;

--- 5、查詢
select * from person_hdfs_1;
           

數倉 Hive HA 介紹與實戰操作講解就到這裡了,有任何疑問請關注我公衆号:大資料與雲原生技術分享,進行技術交流,如本篇文章對您有所幫助,麻煩幫忙一鍵三連(點贊、轉發、收藏)~

繼續閱讀