一、概述
在数据仓库中,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
中:
<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的高可用性,能够保证在出现硬件毛病、软件问题或其他中止状况时依然能够供给持续的查询服务。
以下是一个示例HiveServer2的高可用性装备,运用Apache ZooKeeper来完成毛病切换。请注意,这只是一个简化的示例,实际装备或许会因环境和需求而有所不同。
-
安装和装备ZooKeeper:保证你现已安装和装备了一个ZooKeeper集群。你需要知道ZooKeeper服务器的主机名或IP地址以及端口号。
-
修改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 教程,能够参考我这篇文章:Hadoop HA 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/*
五、测验验证
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 介绍与实战操作讲解就到这儿了,有任何疑问请重视我大众号:大数据与云原生技能分享
,进行技能交流,如本篇文章对您有所协助,费事帮忙一键三连(点赞、转发、收藏)~