1. 这不是“一键部署”,而是一次对分布式系统底层逻辑的重新校准
你搜到这个标题时,大概率正站在某个技术决策的十字路口:可能是某高校实验室需要跑大规模图计算实验,也可能是某初创公司准备搭建用户行为分析平台,又或者是一位正在准备大数据方向面试的工程师,想亲手把教科书里的架构图变成可敲命令、可查日志、可压测的活体系统。阿里云ECS服务器搭建6节点Hadoop+HBase+Spark集群——这17个字背后,不是一套预装镜像的点选操作,而是一场涉及网络拓扑、资源调度、状态一致性、JVM调优与Linux内核参数协同的系统性工程实践。
我带过三届学生做这个集群项目,也帮两家中小型企业从零落地过同构环境。最深的体会是:90%的失败不源于代码写错,而源于对“为什么必须这样配”的认知断层。比如,为什么NameNode必须独占一台ECS?为什么RegionServer的堆内存不能超过16GB?为什么Spark的executor-memory要按YARN container大小反向推算?这些答案藏在HDFS的块汇报机制、HBase的WAL刷盘策略、Spark的Shuffle Manager内存模型里,而不是在某份“保姆级教程”的第7步截图中。
这个集群不是玩具。它承载的是真实数据流的压力测试、是业务查询的毫秒级响应承诺、是故障发生时能否自动恢复的SLA底线。所以本文不提供“复制粘贴就能跑”的脚本合集,而是带你一帧一帧拆解6台ECS如何从彼此陌生的IP地址,演变为一个能协同处理TB级数据的有机体。你会看到:
- 如何用最小成本规避阿里云VPC内网延迟抖动对ZooKeeper选举的影响;
- 为什么HBase的hbase.regionserver.handler.count要根据CPU核心数×2.5动态计算,而非直接填30;
- Spark on YARN模式下,driver和executor的JVM GC日志如何暴露内存泄漏的蛛丝马迹;
- 当HDFS显示“Under replicated blocks”时,究竟是磁盘故障、网络分区,还是namenode心跳超时阈值设得太激进?
如果你需要的是现成镜像或托管服务,这篇内容可能让你失望;但如果你希望下次面对“集群响应变慢”时,能精准定位到是DataNode的dfs.datanode.max.transfer.threads被压满,而不是盲目重启服务——那接下来的每一段,都是你未来排查问题时会反复翻看的笔记。
2. 整体架构设计与节点角色分配逻辑
2.1 为什么是6节点?而非3节点或12节点?
集群规模不是拍脑袋决定的。我们选择6台ECS,是基于三个刚性约束的交叉验证结果:数据可靠性、计算吞吐瓶颈、运维复杂度。先说结论:这是中小规模生产环境的黄金平衡点,既避免了3节点集群在单点故障时的雪崩风险,又规避了12节点带来的ZooKeeper选举开销剧增与HDFS元数据压力。
数据可靠性维度:HDFS默认副本数为3。若采用3节点部署,一旦某台机器宕机,剩余两台需同时承担该节点的全部数据块读写压力,且无法满足“写入时同步落盘到3个副本”的强一致性要求(因只剩2个可用节点)。6节点则允许同时容忍2台机器离线,仍能维持3副本完整性和读写服务能力。计算依据是:当节点数N≥2×R(R为副本数)时,系统具备R-1节点容错能力。此处R=3,故N≥6。
计算吞吐瓶颈维度:Spark任务调度依赖YARN ResourceManager,其心跳处理能力与集群节点数呈非线性关系。实测数据显示,当DataNode/NodeManager节点数超过8台时,ResourceManager的CPU使用率在高峰期会持续高于75%,导致新任务提交延迟显著增加。6节点集群在同等规格ECS(如4核16GB)下,ResourceManager CPU峰值稳定在45%~55%,留有足够余量应对突发流量。
运维复杂度维度:HBase的RegionServer故障转移依赖ZooKeeper协调。ZooKeeper集群推荐奇数节点(3/5/7),但节点数越多,选举耗时越长。6节点集群中,我们采用3节点ZooKeeper(独立部署于3台ECS),剩余3台分别承担HDFS NameNode+SecondaryNameNode、YARN ResourceManager+JobHistoryServer、HBase Master+BackupMaster角色。这种“3+3”分组既保证ZK高可用,又避免将所有管理服务塞进单台机器导致单点瓶颈。
提示:切勿将NameNode与DataNode部署在同一台ECS。NameNode需频繁进行FSImage合并与EditLog重放,其JVM GC停顿会直接影响DataNode的心跳上报,进而触发误判的节点失效。
2.2 节点角色映射表与硬件规格选型依据
下表明确每台ECS的角色分工、最低硬件配置及选型逻辑。所有配置均基于阿里云华东1地域(杭州)的ecs.g7.2xlarge实例(8核32GB)实测优化,非理论值:
| ECS序号 | 角色组合 | CPU/内存 | 磁盘配置 | 选型依据 |
|---|---|---|---|---|
| ECS-01 | NameNode + SecondaryNameNode + ZooKeeper | 8核32GB | 1×1TB高效云盘(系统盘)+ 2×2TB SSD云盘(数据盘) | NameNode内存需容纳全量元数据(1亿文件约需24GB堆内存),SSD云盘降低FSImage加载速度;ZK对磁盘IOPS敏感,SSD保障选举日志写入延迟<5ms |
| ECS-02 | ResourceManager + JobHistoryServer + ZooKeeper | 8核32GB | 1×1TB高效云盘 + 1×500GB SSD云盘(日志盘) | RM需处理全集群Container调度,内存压力大;JobHistoryServer需快速检索历史作业日志,SSD提升索引查询速度 |
| ECS-03 | HBase Master + BackupMaster + ZooKeeper | 8核32GB | 1×1TB高效云盘 + 1×500GB SSD云盘(WAL日志盘) | HBase Master不存数据,但需实时监控RegionServer状态,内存用于缓存Region分布信息;WAL日志必须写入低延迟磁盘,否则影响写入吞吐 |
| ECS-04 | DataNode + NodeManager + RegionServer | 16核64GB | 1×1TB高效云盘 + 4×2TB SSD云盘(HDFS数据盘+HBase StoreFile盘) | 计算密集型角色,需大内存缓存Block元数据与HFile索引;SSD云盘提升随机读写性能,实测比高效云盘HBase Scan延迟降低63% |
| ECS-05 | DataNode + NodeManager + RegionServer | 16核64GB | 同ECS-04 | 均衡负载,避免单点过载;双RegionServer可支撑更高并发写入请求 |
| ECS-06 | DataNode + NodeManager + RegionServer | 16核64GB | 同ECS-04 | 为后续扩展预留1台空闲DataNode,便于在线扩容HDFS容量 |
关键细节说明:
- 为什么ECS-04至06用16核64GB?Spark executor常驻内存需预留20GB以上,HBase RegionServer堆内存建议12~16GB,DataNode自身需4~6GB,三者叠加后8核32GB极易OOM。实测16核64GB下,三服务共存时内存占用率稳定在65%~75%,GC频率可控。
- SSD云盘为何必须单独挂载?阿里云SSD云盘的IOPS与吞吐量随磁盘容量线性增长。2TB SSD云盘可提供最高30000 IOPS与350MB/s吞吐,而系统盘(高效云盘)仅3000 IOPS。HBase的WAL写入和HDFS的Block追加均为顺序小IO,SSD的IOPS优势直接转化为写入TPS提升。
- ZooKeeper为何跨3台部署?ZK集群节点数必须为奇数以避免脑裂。3节点可容忍1节点故障,5节点虽容错更强但选举耗时增加40%,且无必要——我们的HBase Master已配置自动Failover,ZK仅需保障基础协调功能。
2.3 网络拓扑与安全组策略设计
在阿里云VPC内,网络延迟是分布式系统稳定的隐形杀手。我们放弃默认的“所有端口全通”安全组,采用精细化端口管控,既保障服务通信,又杜绝横向渗透风险。
VPC与交换机规划:创建独立VPC(网段10.0.0.0/16),在可用区A、B、C各部署1个交换机(子网10.0.1.0/24、10.0.2.0/24、10.0.3.0/24)。6台ECS均匀分布在3个可用区(如ECS-01/02/03在A区,ECS-04/05/06在B区),利用阿里云跨可用区延迟<2ms的特性,确保ZooKeeper心跳包不丢包。
安全组规则核心项(所有规则均设置源地址为本VPC内网段10.0.0.0/16):
- NameNode必需端口:8020(RPC)、50070(WebUI)、9000(HDFS客户端端口)
- DataNode必需端口:50010(Block传输)、50020(DataNode IPC)、50075(WebUI)
- ResourceManager必需端口:8030(Scheduler)、8031(Resource Tracker)、8032(NodeManager)、8088(WebUI)
- HBase Master必需端口:16000(RPC)、16010(WebUI)
- RegionServer必需端口:16020(RPC)、16030(WebUI)
- ZooKeeper必需端口:2181(客户端连接)、2888(Follower通信)、3888(Leader选举)
- Spark History Server端口:18080(WebUI)
注意:务必关闭所有ECS的公网IP。所有服务间通信走内网,避免公网带宽成为瓶颈。曾有客户因误开DataNode 50010端口至公网,导致恶意节点伪造Block传输请求,引发集群拒绝服务。
3. 核心组件安装与关键参数调优
3.1 Java与SSH免密登录:被低估的基石工程
很多人跳过这一步直接装Hadoop,结果在启动DataNode时卡在“Connection refused”。根源在于Java版本不兼容与SSH密钥未正确分发。
Java版本选择:严格使用OpenJDK 11.0.22(LTS版本)。Hadoop 3.3.6官方文档明确标注“不支持JDK 17+”,因Hadoop的Kerberos认证模块依赖JDK 11的Security Provider。实测JDK 17会导致HBase RegionServer启动后立即OOM,错误日志中出现
java.lang.OutOfMemoryError: Metaspace——这是JDK 17的Metaspace GC策略与HBase动态类加载冲突所致。SSH免密登录配置:
- 在ECS-01(NameNode)执行
ssh-keygen -t rsa -b 4096生成密钥对; - 将公钥
id_rsa.pub内容追加到所有6台ECS的~/.ssh/authorized_keys文件末尾(注意权限:chmod 600 ~/.ssh/authorized_keys); - 关键验证:从ECS-01执行
for i in {01..06}; do ssh ecs-$i "hostname"; done,必须100%返回主机名,无密码提示。若某台失败,检查/var/log/secure日志中的sshd报错,常见原因是/etc/ssh/sshd_config中PubkeyAuthentication yes被注释。
- 在ECS-01(NameNode)执行
实操心得:阿里云ECS默认禁用root远程登录。务必用创建实例时指定的普通用户(如
ubuntu或centos)完成密钥分发,再通过sudo su -切换root。切勿修改PermitRootLogin yes,这违反安全基线。
3.2 Hadoop 3.3.6深度配置解析
Hadoop配置不是填参数,而是对分布式文件系统运行机制的理解输出。以下为core-site.xml、hdfs-site.xml、yarn-site.xml中必须修改的5个核心参数及其物理意义:
core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://ecs-01:8020</value> <!-- 指向NameNode的RPC地址,非WebUI地址 --> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> <!-- 必须指向SSD云盘挂载路径,避免系统盘IO瓶颈 --> </property>hdfs-site.xml
<property> <name>dfs.namenode.name.dir</name> <value>file:///data/hadoop/nn</value> <!-- NameNode元数据存储,SSD云盘 --> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///data/hadoop/dn1,file:///data/hadoop/dn2</value> <!-- 指向2块SSD云盘,实现IO并行 --> </property> <property> <name>dfs.replication</name> <value>3</value> <!-- 与集群规模匹配,6节点下3副本为最优解 --> </property>yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>ecs-02</value> <!-- 明确指定RM所在节点,避免DNS解析失败 --> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>57344</value> <!-- 16核64GB节点,预留8GB给OS,剩余56GB≈57344MB --> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>16384</value> <!-- 单个Container最大内存16GB,防止Spark Executor超限 --> </property>参数计算逻辑:
yarn.nodemanager.resource.memory-mb= 总内存(64GB) - OS预留(8GB) = 56GB = 57344MB。OS预留8GB是硬性要求,因Linux内核、sshd、zookeeper进程需稳定内存。yarn.scheduler.maximum-allocation-mb设为16384(16GB)而非32768,是为了匹配Spark executor-memory上限。若设为32GB,Spark可能申请超大Container,导致YARN无法调度其他任务,形成资源饥饿。
3.3 HBase 2.4.16的存储引擎级调优
HBase性能70%取决于存储层配置。我们绕过HFile压缩等高级选项,聚焦三个直击痛点的参数:
hbase-site.xml
<property> <name>hbase.rootdir</name> <value>hdfs://ecs-01:8020/hbase</value> <!-- HBase数据存于HDFS,非本地磁盘 --> </property> <property> <name>hbase.zookeeper.quorum</name> <value>ecs-01,ecs-02,ecs-03</value> <!-- 显式列出ZK节点,避免DNS单点故障 --> </property> <property> <name>hbase.regionserver.handler.count</name> <value>60</value> <!-- 16核CPU × 2.5 ≈ 40,向上取整为60,预留20%弹性 --> </property> <property> <name>hbase.hregion.majorcompaction</name> <value>0</value> <!-- 关闭自动Major Compaction,改由运维脚本在凌晨低峰期触发 --> </property> <property> <name>hbase.wal.provider</name> <value>filesystem</value> <!-- 强制使用文件系统WAL,而非默认的AsyncWAL,保障数据强一致 --> </property>hbase.regionserver.handler.count为何是60?此参数定义RegionServer处理客户端RPC请求的线程池大小。线程数过少(如默认30)会导致请求排队,RT飙升;过多(如100)则引发上下文切换开销。公式:CPU核心数 × (2~3)。16核取2.5倍得40,但HBase写入时需额外线程处理WAL刷盘与MemStore Flush,故上浮至60。实测此值下,1000并发Put请求的P95延迟稳定在15ms内。hbase.hregion.majorcompaction=0的深层考量:Major Compaction会合并所有StoreFile,产生大量磁盘IO,导致RegionServer暂停服务数分钟。在业务高峰期触发,等于主动拒绝服务。我们改为每日02:00通过hbase org.apache.hadoop.hbase.util.HBaseFsck -fixReferenceFiles脚本触发,且限定Compaction速率不超过50MB/s(通过hbase.hstore.compaction.throughput.lower.bound控制)。
3.4 Spark 3.3.2 on YARN的Executor内存模型精算
Spark最易踩坑的是内存配置。spark.executor.memory不是简单填数字,而是需反向推算YARN Container内存上限。
spark-defaults.conf关键配置:
spark.master yarn spark.submit.deployMode client spark.yarn.am.memory 2g spark.yarn.am.memoryOverhead 1024 spark.executor.memory 12g spark.executor.memoryOverhead 4096 spark.executor.cores 4 spark.executor.instances 15 spark.driver.memory 4g spark.driver.memoryOverhead 2048内存计算链路:
- YARN Container总内存 =
spark.executor.memory+spark.executor.memoryOverhead= 12GB + 4GB = 16GB; - 此值必须 ≤
yarn.scheduler.maximum-allocation-mb(我们设为16384MB),否则Container申请失败; spark.executor.memoryOverhead是JVM堆外内存,用于Netty缓冲区、Python RDD序列化等,按堆内存的30%~50%设置。12GB堆内存对应4GB Overhead属合理范围;spark.executor.cores=4意味着每个Executor独占4个CPU核心,15个Executor × 4核 = 60核,恰好匹配3台DataNode(每台16核)的总计算资源,避免CPU争抢。
实操心得:首次提交Spark作业时,务必添加
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/usr/bin/python3。阿里云ECS默认Python路径为/usr/bin/python3,若不显式指定,Spark Driver会因找不到Python解释器而报Py4JJavaError。
4. 集群启动、验证与稳定性加固
4.1 启动顺序与依赖关系校验
分布式系统启动是精密的时序工程。错误的顺序会导致服务间无法注册,形成“死锁式启动失败”。
标准启动流程(必须严格遵循):
- ZooKeeper集群:在ECS-01/02/03依次执行
zkServer.sh start,然后echo stat | nc localhost 2181 | grep Mode确认每台Mode为follower或leader; - HDFS集群:在ECS-01执行
start-dfs.sh,等待2分钟后,执行hdfs dfsadmin -report查看DataNode数量是否为3; - YARN集群:在ECS-02执行
start-yarn.sh,然后yarn node -list确认NodeManager状态为RUNNING; - HBase集群:在ECS-03执行
start-hbase.sh,接着hbase shell中输入status 'detailed',确认RegionServer数量为3且无dead节点; - Spark History Server:在ECS-02执行
sbin/start-history-server.sh,访问http://ecs-02:18080验证UI可打开。
关键校验点:
- 若
hdfs dfsadmin -report显示DataNode为0,立即检查ECS-04/05/06的/var/log/hadoop-hdfs/hadoop-hdfs-datanode-*.log,90%概率是dfs.datanode.data.dir路径权限错误(应为drwxr-xr-x,属主为hdfs用户); - 若
yarn node -list返回空,检查ECS-02的/var/log/hadoop-yarn/yarn-yarn-resourcemanager-*.log,常见错误是Address already in use,说明8030端口被其他进程占用。
4.2 生产级健康检查脚本编写
人工逐条命令验证效率低下。我们编写了一个cluster-health-check.sh脚本,5分钟内完成全链路诊断:
#!/bin/bash # 检查ZK集群状态 echo "=== ZooKeeper Cluster Status ===" for node in ecs-01 ecs-02 ecs-03; do echo -n "$node: " ssh $node "echo stat | nc localhost 2181 2>/dev/null | grep Mode" done # 检查HDFS DataNode存活数 echo -e "\n=== HDFS DataNode Count ===" hdfs dfsadmin -report | grep "Live datanodes" | awk '{print $3}' # 检查YARN NodeManager数量 echo -e "\n=== YARN NodeManager Count ===" yarn node -list 2>/dev/null | grep "Total Nodes" | awk '{print $3}' # 检查HBase RegionServer数量 echo -e "\n=== HBase RegionServer Count ===" hbase shell -n -e "status 'detailed'" 2>/dev/null | grep "servers" | awk '{print $2}'将此脚本部署到ECS-01,每次集群变更后执行,输出类似:
=== ZooKeeper Cluster Status === ecs-01: Mode: follower ecs-02: Mode: leader ecs-03: Mode: follower === HDFS DataNode Count === 3 === YARN NodeManager Count === 3 === HBase RegionServer Count === 3注意:脚本中
hbase shell -n的-n参数至关重要,它禁用交互式提示符,使输出可被grep精准匹配。若漏掉,status 'detailed'会输出大量无关字符,导致计数失败。
4.3 稳定性加固:内核参数与日志轮转
云服务器默认内核参数不适应大数据场景。我们在所有6台ECS上执行以下加固:
内核参数优化(/etc/sysctl.conf):
# 提升网络连接数 net.core.somaxconn = 65535 net.ipv4.ip_local_port_range = 1024 65535 # 减少TIME_WAIT套接字占用 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 # 优化内存回收 vm.swappiness = 1 vm.vfs_cache_pressure = 50执行sysctl -p生效。其中vm.swappiness=1是关键——Hadoop/HBase/Spark进程内存占用巨大,若swappiness设为默认60,内核会频繁将进程内存页换出到swap,导致GC停顿长达数秒。
日志轮转配置(/etc/logrotate.d/hadoop):
/var/log/hadoop-*/hadoop-*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 hdfs hadoop sharedscripts postrotate if [ -f /var/run/hadoop/hadoop-hdfs-namenode.pid ]; then kill -USR1 `cat /var/run/hadoop/hadoop-hdfs-namenode.pid` fi endscript }此配置确保HDFS日志每日切割,保留30天,且触发kill -USR1通知NameNode滚动日志,避免日志文件无限增长撑爆磁盘。
5. 常见故障排查与独家避坑指南
5.1 “Under replicated blocks”问题的三层归因法
HDFS WebUI(http://ecs-01:9870)显示“Under replicated blocks: 12345”是高频告警。新手常直接执行hdfs fsck / -files -blocks -locations,却不知如何解读结果。我们建立三层归因框架:
第一层:网络层诊断
执行ping ecs-04、telnet ecs-04 50010(DataNode Block传输端口)。若telnet超时,说明安全组未开放50010端口,或ECS-04的防火墙(firewalld)拦截。此时需:
# 在ECS-04执行 sudo firewall-cmd --permanent --add-port=50010/tcp sudo firewall-cmd --reload第二层:磁盘层诊断
若网络通畅,检查ECS-04的磁盘空间:df -h /data/hadoop/dn1。HDFS默认当磁盘使用率>90%时,DataNode自动退出服务。解决方案:
- 清理
/data/hadoop/tmp临时文件; - 执行
hdfs dfs -du -h /定位大目录,删除无用数据; - 永久方案:修改
hdfs-site.xml中dfs.datanode.du.reserved为10737418240(10GB),预留10GB空间防止单点磁盘打满。
第三层:心跳层诊断
若磁盘充足,检查ECS-04的DataNode日志:tail -100 /var/log/hadoop-hdfs/hadoop-hdfs-datanode-*.log | grep "heartbeat"。若出现Heartbeat failed with status 0,说明NameNode未收到心跳。根因常是:
- NameNode的
dfs.namenode.heartbeat.recheck-interval(默认300000ms=5分钟)过长,需缩短至120000; - 或ECS-04的系统时间与NTP服务器偏差>5秒,执行
sudo ntpdate -u ntp.aliyun.com校时。
5.2 HBase RegionServer频繁挂起的JVM GC陷阱
现象:HBase WebUI(http://ecs-03:16010)中RegionServer状态忽绿忽红,日志中反复出现GC overhead limit exceeded。这不是内存不足,而是GC策略失配。
根本原因:HBase RegionServer的MemStore与BlockCache共享JVM堆内存。当MemStore写满触发Flush时,会产生大量短生命周期对象,Young GC频繁;若Eden区过小,对象直接进入Old区,触发Full GC。
解决方案:
- 修改
hbase-env.sh,显式设置GC参数:
export HBASE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms12g -Xmx12g"- 调整G1GC关键参数:
-XX:G1HeapRegionSize=4M:Region大小设为4MB,匹配HBase平均Cell大小;-XX:G1NewSizePercent=30:Young区最小占比30%,保障Flush时有足够空间;-XX:G1MaxNewSizePercent=60:Young区最大占比60%,防止单次Flush压垮Eden。
实测效果:GC停顿从平均800ms降至120ms以内,RegionServer挂起频率下降95%。
5.3 Spark作业提交后卡在ACCEPTED状态的YARN资源死锁
现象:spark-submit命令返回Submitted application application_1234567890_0001,但yarn application -list中状态长期为ACCEPTED,不进入RUNNING。
排查路径:
- 查看YARN ResourceManager日志:
tail -100 /var/log/hadoop-yarn/yarn-yarn-resourcemanager-*.log | grep "application_1234567890_0001"; - 若发现
Failed to assign container,检查YARN NodeManager是否真正注册:yarn node -list; - 若NodeManager显示
UNHEALTHY,执行yarn node -status <node-id>,常见原因为:- NodeManager的
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage(默认90%)被触发,需清理磁盘; - 或
yarn.nodemanager.local-dirs路径(如/data/yarn/local)权限错误,应为drwxr-xr-x,属主yarn。
- NodeManager的
独家技巧:当YARN资源紧张时,Spark作业可能因
AM container is launched, waiting for AM container to be registered卡住。此时无需重启服务,执行yarn application -kill application_1234567890_0001终止后重提,因YARN的ApplicationMaster重试机制会自动选择空闲NodeManager。
6. 性能压测与容量规划实战
6.1 使用HiBench进行端到端压测
HiBench是验证集群真实吞吐的黄金标准。我们跳过复杂的编译,直接使用预编译包:
# 下载HiBench 8.0(适配Spark 3.3) wget https://github.com/Intel-bigdata/HiBench/releases/download/v8.0/hibench-8.0.tar.gz tar -xzf hibench-8.0.tar.gz cd hibench # 配置Spark引擎 sed -i 's/hibench.spark.home.*/hibench.spark.home \/opt\/spark/g' conf/spark.conf sed -i 's/hibench.spark.master.*/hibench.spark.master yarn/g' conf/spark.conf # 运行WordCount压测(10GB输入数据) bin/workloads/micro/wordcount/prepare/prepare.sh bin/workloads/micro/wordcount/spark/run.sh关键观察指标:
- HDFS吞吐:
hdfs dfs -du -h /HiBench/WordCount/Input应显示10GB数据,hdfs dfsadmin -report中“Blocks total”应接近10GB/128MB=78个; - Spark Stage耗时:WebUI(http://ecs-02:18080)中WordCount作业的Shuffle Write量应>5GB,表明数据在Executor间有效流动;
- HBase随机读写:运行
bin/workloads/sql/q1/prepare/prepare.sh后,Q1查询P95延迟应<200ms。
6.2 容量规划:从当前6节点到未来12节点的平滑演进
集群不会永远停留在6节点。我们设计了无停机扩容路径:
HDFS扩容:
- 新购ECS-07(16核64GB),挂载4×2TB SSD云盘;
- 在ECS-07部署DataNode,配置
dfs.datanode.data.dir指向新磁盘; - 执行
hdfs dfsadmin -refreshNodes,NameNode自动发现新节点; - 执行
hdfs balancer -threshold 10,将数据均衡至新节点(阈值10表示各节点磁盘使用率差≤10%)。
HBase扩容:
- 新购ECS-08(8核32GB),部署RegionServer;
- 修改
hbase-site.xml中hbase.regionserver.hostname为ECS-08的内网IP; - 在ECS-08执行
hbase-daemon.sh start regionserver; - HBase Master自动分配Region,无需人工干预。
重要提醒:扩容前务必执行
hbase hbck -repair检查元数据一致性。曾有客户在RegionServer扩容后发现部分Region处于OFFLINE状态,根源是.META.表损坏,-repair可自动修复。
7. 运维监控体系搭建:从“救火”到“预测”
集群稳定性的终极体现,是能在故障发生前感知异常。我们摒弃商业监控工具,用开源栈构建轻量级预测体系:
核心组件:
- Prometheus:部署在ECS-02,采集Hadoop、HBase、Spark的JMX指标;
- Grafana:部署在ECS-02,可视化Prometheus数据;
- Alertmanager:部署在ECS-02,配置邮件/钉钉告警。
**关键监控项配置