数仓 Hive HA 介绍与实战操作
创始人
2025-06-28 12:41:04
0

一、概述

在数据仓库中,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 MetaStore HA 介绍与配置

Hive MetaStore HA(High Availability)是为了保证Hive元数据存储的高可用性而采取的一系列措施和配置。Hive元数据存储在MetaStore中,包括表的定义、分区、表的属性等信息。确保Hive MetaStore的高可用性是保障整个Hive系统可靠性和稳定性的重要一步。

常规连接原理:

图片图片

高可用原理:

图片图片

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


  
 	hive.server2.thrift.bind.host
  	metastore1_host
  
  
  
  
    hive.metastore.uris
    
      thrift://metastore1_host:9083,
      thrift://metastore2_host:9083
    
  
  

在这个示例中,你需要将 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的高可用性,可以确保在出现硬件故障、软件问题或其他中断情况时仍然能够提供持续的查询服务。

图片图片

以下是一个示例HiveServer2的高可用性配置,使用Apache ZooKeeper来实现故障切换。请注意,这只是一个简化的示例,实际配置可能会因环境和需求而有所不同。

  1. 安装和配置ZooKeeper:确保你已经安装和配置了一个ZooKeeper集群。你需要知道ZooKeeper服务器的主机名或IP地址以及端口号。
  2. 编辑Hive Site配置:打开Hive的配置文件 hive-site.xml,添加以下属性来配置HiveServer2的高可用性和与ZooKeeper的集成:

  
  
    hive.server2.zookeeper.namespace
    hiveserver2
  
  
    hive.zookeeper.client.port
    2181
  
  
    hive.zookeeper.quorum
    zk1_host:2181,zk2_host:2181,zk3_host:2181
  
  
    hive.server2.support.dynamic.service.discovery
    true
  
  

将zk1_host、zk2_host、zk3_host替换为你的ZooKeeper主机地址和端口号。

四、环境部署

这里为了快速部署环境,就使用k8s 环境部署Hadoop了。关于 hadoop on k8s 教程,可以参考我这篇文章:Hadoop HA on k8s 编排部署进阶篇

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




	
	
			hive.metastore.warehouse.dir
			/user/hive_remote/warehouse
	

	
			hive.metastore.local
			false
	

	
	
			javax.jdo.option.ConnectionURL
			jdbc:mysql://192.168.182.110:13306/hive_metastore?createDatabaseIfNotExist=true&useSSL=false&serverTimeznotallow=Asia/Shanghai
	

	
	
			javax.jdo.option.ConnectionDriverName
			
			com.mysql.jdbc.Driver
	

	
	
			javax.jdo.option.ConnectionUserName
			root
	

	
	
			javax.jdo.option.ConnectionPassword
			123456
	

	
	
			hive.metastore.schema.verification
			false
	

	
			system:user.name
			root
			user name
	

	
			hive.metastore.uris
			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 }}
	

	
	
			hive.server2.thrift.bind.host
			0.0.0.0
			Bind host on which to run the HiveServer2 Thrift service.
	

	
	
			hive.server2.thrift.port
			{{ .Values.service.hive.hiveserver2.port }}
	
	
	
	
	
			hive.server2.zookeeper.namespace
			hiveserver2
	

	
	
			hive.zookeeper.client.port
			2181
	

	
	
			hive.zookeeper.quorum
			{{ 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
	

	
	
			hive.server2.support.dynamic.service.discovery
			true
	

【温馨提示】如果不是使用 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/*

图片图片

五、测试验证

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;

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...