大数据系统架构实践(三):Hbase集群部署
文章目录
随着数据体量的爆炸式增长,传统关系型数据库在海量数据的存储与高并发访问场景下逐渐显得力不从心。为应对这一挑战,分布式数据库系统应运而生,其中 HBase 作为构建在 Hadoop 生态之上的高可靠、高可扩展的列式存储系统,被广泛应用于日志存储、用户行为追踪、时间序列数据管理等领域。
本系列将围绕大数据系统的核心组件及其部署实践进行系统介绍。本篇作为第三篇,将聚焦于 HBase 的架构原理、核心组件、集群部署方式以及关键配置说明,为后续深入理解 HBase 与 Hadoop 生态中如 Hive、Phoenix 等组件的协同使用奠定基础。
一、Hbase简介
HBase 是一个开源的、分布式的、面向列的 NoSQL 数据库,最初由 Apache Hadoop 项目中的子项目演变而来,设计灵感来源于 Google 的 Bigtable 论文。它构建在 Hadoop HDFS 之上,具备高可扩展性、高容错性,适用于实时读写海量非结构化和半结构化数据的场景。
HBase 的 核心特性
包括:
- 面向列存储:适合高稀疏度、高压缩比的数据模型,与关系型数据库按行存储的方式不同
- 高可扩展性:通过 RegionServer 的横向扩展支持 PB 级别数据存储和访问
- 支持实时读写:相比传统 Hadoop 的批处理能力,HBase 适合低延迟的在线读写访问
- 与 Hadoop 深度集成:依赖 HDFS 提供的分布式存储能力,支持与 MapReduce、Hive、Phoenix 等组件协同工作
- 强一致性保证:支持行级原子性操作,保障数据写入与读取的一致性
HBase 的 应用场景
包括但不限于:
- 日志数据存储与分析(如用户行为日志)
- 实时指标系统(如广告点击监控、IoT 数据采集)
- 大规模时间序列数据库
- 数据平台中的宽表存储方案
作为 Hadoop 生态的重要组成部分,HBase 提供了与传统关系型数据库完全不同的数据建模方式和存储访问机制,是构建现代大数据平台的重要基石之一。
二、部署前准备
HBase 采用典型的主从架构,核心由 Master
节点 和多个 RegionServer
节点 构成,同时依赖 HDFS 提供底层分布式存储能力。为了保证系统的高可用性与负载均衡,HBase 通常部署为多节点集群:
- 最基本的部署架构包括:一个 HMaster + 多个 HRegionServer
- 为提升可用性,可部署备用 HMaster(Standby Master)
- 后端存储依赖 HDFS,因此需提前部署好 Hadoop 集群(或直接与现有 Hadoop 集群对接)
在生产环境中,3 台服务器组成的小型 HBase 集群可作为基础部署,既满足功能验证和开发测试需求,又具备一定的扩展能力。
✅ 三台服务器的配置与角色
节点名称 | 主机名 | ip地址 | 角色 |
---|---|---|---|
master | master | 192.168.100.1 | HMaster,HRegionServer |
slave1 | slave1 | 192.168.100.2 | HRegionServer |
slave2 | slave2 | 192.168.100.3 | HRegionServer |
HBase 集群默认使用 ZooKeeper 管理集群元数据及选主,因此部署至少 3 个 ZooKeeper 实例以实现故障容错,RegionServer 是实际处理读写请求、管理数据分区(Region)的工作节点
✅ JDK 依赖环境
Hbase 基于 Java 开发,运行前请确保已安装 JDK 1.8 或以上版本
三、部署Hbase集群
以下步骤在 master
节点上执行,其他节点通过配置同步
1. 下载并解压安装包
# 下载地址(以2.3.7版本为例)
https://archive.apache.org/dist/hbase/
# 解压移动
tar xf hbase-2.3.7-bin.tar.gz
mv hbase-2.3.7 /usr/local/hbase
2. 配置hbase-site.xml
用于定义 HBase 的存储目录、集群模式、ZooKeeper 连接及 Phoenix 参数等关键配置
vim /usr/local/hbase/conf/hbase-site.xml
<configuration>
<!-- HBase 存储根目录(HDFS路径) -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9820/hbase</value>
</property>
<!-- 启用分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- ZooKeeper 集群主机名(需解析) -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
<!--默认: 180000 :Zookeeper 会话超时时间,单位是毫秒 -->
<property>
<name>zookeeper.session.timeout</name>
<value>240000</value>
</property>
<!-- 动态加载的 Jar 包目录(HDFS路径) -->
<property>
<name>hbase.dynamic.jars.dir</name>
<value>${hbase.rootdir}/lib</value>
</property>
<!-- Phoenix 相关配置 -->
<property>
<name>phoenix.functions.allowUserDefinedFunctions</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
<property>
<name>phoenix.mutate.batchSize</name>
<value>200000</value>
</property>
<property>
<name>phoenix.mutate.maxSize</name>
<value>15000000</value>
</property>
<property>
<name>phoenix.mutate.maxSizeBytes</name>
<value>1048576000</value>
</property>
<property>
<name>phoenix.query.timeoutMs</name>
<value>600000</value>
</property>
<property>
<name>phoenix.query.keepAliveMs</name>
<value>600000</value>
</property>
<property>
<name>phoenix.coprocessor.maxServerCacheTimeToLiveMs</name>
<value>300000000</value>
</property>
<!-- 客户端/服务器参数 -->
<property>
<name>hbase.rpc.timeout</name>
<value>600000</value>
</property>
<property>
<name>hbase.client.operation.timeout</name>
<value>600000</value>
</property>
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>600000</value>
</property>
<property>
<name>hbase.regionserver.lease.period</name>
<value>600000</value>
</property>
<property>
<name>hbase.client.ipc.pool.type</name>
<value>RoundRobinPool</value>
</property>
<property>
<name>hbase.client.ipc.pool.size</name>
<value>10</value>
</property>
<!-- 其他配置 -->
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.coprocessor.abortonerror</name>
<value>false</value>
</property>
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.quota.enabled</name>
<value>true</value>
</property>
<property>
<name>hbase.quota.refresh.period</name>
<value>1000</value>
</property>
<property>
<name>hbase.master.loadbalance.bytable</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
</configuration>
3. 配置hbase-env.sh
用于设置 HBase 启动参数、Java 环境变量及内存等运行时配置
vim /usr/local/hbase/conf/hbase-env.sh
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=false
export HBASE_CLASSPATH=/usr/local/hadoop/
export HBASE_HOME=/usr/local/hbase
export HBASE_LOG_DIR=${HBASE_HOME}/logs
export HBASE_HEAPSIZE=4096M
export HBASE_MASTER_OPTS="-Xmx2g -Xms2g -Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
export HBASE_REGIONSERVER_OPTS="-Xmx4g -Xms4g -Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xloggc:/usr/local/hbase/logs/gc-hbase.log"
4. 配置regionservers
用于定义 HBase 中各 RegionServer
所在主机,支持集群中数据分片和并发处理
vim /usr/local/hbase/conf/regionservers
master
slave1
slave2
5. 复制Phoenix-jar包
Phoenix 是构建在 HBase 之上的 SQL 层,运行时需要 RegionServer 能识别 Phoenix 的类。因此,我们需要将 Phoenix 的 JAR 包放入 HBase 的类路径中(即 lib/ 目录),确保在 RegionServer 启动时就加载这些类。否则,执行 SQL 查询时会报 ClassNotFoundException。
# 下载地址(Hbase版本为2.3.7)
https://dlcdn.apache.org/phoenix/phoenix-5.1.3/phoenix-hbase-2.3-5.1.3-bin.tar.gz
# 解压移动
tar xf phoenix-hbase-2.3-5.1.3-bin.tar.gz
mv phoenix-hbase-2.3-5.1.3-bin /usr/local/phoenix
# 将Phoenix核心依赖JAR复制到HBase的lib目录
cp /usr/local/phoenix/phoenix-pherf-5.1.3.jar /usr/local/hbase/lib/
cp /usr/local/phoenix/phoenix-server-hbase-2.3-5.1.3.jar /usr/local/hbase/lib/
6. 同步Hbase目录
scp -rp /usr/local/hbase slave1:/usr/local/
scp -rp /usr/local/hbase slave2:/usr/local/
7. 启动Hbase集群
/usr/local/hbase/bin/start-hbase.sh
# 验证
netstat -tnlp|grep -E "16010|16020|16030"
8. 界面展示
HMaster Web UI:http://192.168.100.1:16010
总结
🚀 本文详细介绍了 HBase 集群的架构特点及多节点部署流程,涵盖了关键配置文件说明及环境准备要点,确保集群具备高可用性与良好性能表现。通过配置 ZooKeeper、RegionServer 和 Phoenix 等组件,实现了 HBase 与 Hadoop 生态的无缝集成,满足了海量数据的实时读写需求。
📌 下一篇将聚焦大数据生态中不可或缺的实时消息系统 —— Kafka,讲解其分布式架构设计、集群部署以及如何实现高吞吐、低延迟的数据流处理,助力构建完善的大数据实时处理平台。