news 2026/9/16 22:59:28

Hadoop集群启停原理与故障排查实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hadoop集群启停原理与故障排查实战指南

1. 这不是“背命令”,而是理解Hadoop生态的运行脉络

你搜“hadoop集群启动停止命令”,点开一堆博客,复制粘贴几行shell就完事——结果namenode起不来、yarn ResourceManager报错、spark-shell连不上master,最后卡在日志里翻到凌晨三点。我干这行十年,带过三十多个Hadoop项目,最常听到的抱怨不是“不会写MapReduce”,而是“集群启停像拆炸弹”。为什么?因为这些命令从来不是孤立存在的指令,它们是整个分布式系统状态流转的开关。namenode不是“start-dfs.sh”一敲就活了,它背后牵着ZooKeeper的选举、JournalNode的日志同步、DataNode的心跳注册;yarn的start-yarn.sh启动的不只是ResourceManager,还有NodeManager的本地资源管理器、ApplicationMaster的调度容器、甚至可能触发Spark on YARN的Driver注册流程。你看到的是五个服务(namenode、datanode、yarn、spark、hive),实际背后是至少十七个进程、三类配置文件(core-site.xml、hdfs-site.xml、yarn-site.xml)、四层依赖关系(JDK→Hadoop→ZK→YARN→Spark/Hive)。所以这篇不教你怎么“背命令”,而是带你把每个start/stop动作拆解成一次状态诊断:namenode启动时你在看什么日志?datanode连不上namenode,第一眼该扫哪三行错误?yarn nodemanager反复退出,是内存配小了还是磁盘满了?spark-submit提交后卡住,到底是driver没起来,还是application master被yarn拒绝了?hive cli连不上metastore,问题在thrift server端口,还是mysql连接池耗尽?我会用真实生产环境的截图级操作逻辑,告诉你每条命令执行前该check什么、执行中该盯什么、执行后该验什么。适合刚搭完伪分布想上真集群的运维新人,也适合开发同学排查job失败时快速定位是平台层还是应用层的问题。所有命令都基于Hadoop 3.3.6 + Spark 3.4.2 + Hive 3.1.3的主流组合,适配CentOS 7/8和Ubuntu 20.04/22.04,Windows WSL2环境也单独标注注意事项。

2. 启停命令背后的架构逻辑与状态机设计

2.1 HDFS的双节点协同:namenode与datanode不是主从,而是状态协商

很多人误以为namenode是“老板”,datanode是“员工”,start-dfs.sh就是老板发号施令。错。HDFS启动本质是一次分布式状态协商。namenode启动后进入安全模式(Safe Mode),此时它不接受任何写请求,只做一件事:等待所有datanode完成block report(块报告)。每个datanode启动时会扫描本地磁盘上的block文件,生成一个包含所有block ID、大小、校验和的清单,通过RPC发给namenode。namenode收到足够多datanode的report(默认阈值是99.9%的block已汇报),才自动退出安全模式。这就是为什么你常看到“namenode处于安全模式”的告警——不是namenode挂了,而是datanode没报完。实操中我见过最典型的三个卡点:一是datanode的dfs.datanode.data.dir路径下有残留的in_use.lock文件(强制kill进程后未清理),导致datanode拒绝启动;二是namenode的dfs.namenode.handler.count参数太小(默认10),当datanode数量超50台时,handler线程池打满,block report排队超时;三是网络MTU不一致,大块report包被分片丢弃,namenode收不到完整数据。所以start-dfs.sh执行后,你必须立刻检查两个日志:/var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log里找“Exiting safe mode”,/var/log/hadoop-hdfs/hadoop-hdfs-datanode-*.log里找“Received block report”。前者没出现,看后者是否在持续重试;后者报“Connection refused”,立刻查namenode端口9870是否监听、防火墙是否放行。

2.2 YARN的两级调度:ResourceManager与NodeManager的生命周期绑定

yarn的启动比HDFS更复杂,因为它涉及资源隔离。start-yarn.sh启动的不是单个服务,而是一个资源调度闭环:ResourceManager(RM)作为中央调度器,负责分配Container;NodeManager(NM)作为每个节点的代理,负责启动/监控Container。关键点在于:NM启动时会向RM注册,注册成功后RM才将其纳入可用节点池;而RM自身又依赖于ZooKeeper(如果启用HA)或本地文件系统(非HA)来持久化Application状态。所以当你执行start-yarn.sh后,必须验证三个状态:一是jps | grep ResourceManager确认进程存在;二是curl -s http://rm-host:8088/ws/v1/cluster/nodes返回JSON里activeNodes数量是否等于你的NM节点数;三是任意一台NM节点上执行yarn node -list,看是否显示“RUNNING”。我踩过的最大坑是:NM的yarn.nodemanager.resource.memory-mb参数设为8192MB,但物理内存只有12GB,Linux OOM Killer直接干掉NM进程,日志里只有一行“Killed process”,根本找不到yarn相关错误。解决方案不是调大内存参数,而是用free -h确认可用内存,再按70%原则设置(即12GB * 0.7 ≈ 8GB),并开启yarn.nodemanager.vmem-check-enabled=false绕过虚拟内存检查——这是生产环境标配,不是偷懒。

2.3 Spark的三种部署模式:standalone、yarn、k8s,启停逻辑天差地别

Spark本身不提供集群管理,它依赖外部资源管理器。所以“spark启动命令”必须先明确模式:

  • Standalone模式:Spark自带Master/Worker进程,start-all.sh启动Master(端口8080)和Worker(端口8081),但Worker必须能SSH免密登录到所有节点,否则启动失败。实测发现CentOS 7默认禁用root SSH,需改/etc/ssh/sshd_config的PermitRootLogin yes并重启sshd。
  • YARN模式:Spark不启动任何守护进程,spark-submit提交任务时,由YARN动态分配Container运行Driver和Executor。所谓“启动Spark”其实是确保YARN正常,然后用spark-shell --master yarn测试连通性。重点检查yarn.resourcemanager.address配置是否指向正确RM地址,以及spark.yarn.jars是否指向HDFS上的spark-jars目录(hdfs dfs -ls /spark-jars)。
  • Kubernetes模式:需要kubectl权限和spark-operator,启停命令变成kubectl apply -f spark-master.yaml。但当前热词里没提k8s,本文聚焦前两种。
    特别提醒:Spark 3.x默认启用AQE(Adaptive Query Execution),如果yarn.scheduler.maximum-allocation-mb小于spark.sql.adaptive.enabled=true要求的最小内存,job会卡在“Waiting for resources”,日志里看不到ERROR,只有一堆INFO。解决方案是关掉AQE或调大yarn内存上限。

2.4 Hive的元数据服务:metastore不是可选组件,而是单点故障核心

Hive的启动最容易被误解。“hive”命令只是CLI客户端,真正服务端是HiveServer2(HS2)Metastore。HS2处理SQL解析和执行,Metastore管理表结构、分区、统计信息等元数据。两者可合并在一个JVM(--service hiveserver2),也可分离部署(推荐生产环境)。分离时,必须先启动metastore(nohup hive --service metastore > /var/log/hive/metastore.log 2>&1 &),再启动HS2(nohup hiveserver2 > /var/log/hive/hiveserver2.log 2>&1 &)。常见错误是metastore连不上MySQL:一是jdbc url写错(jdbc:mysql://mysql-host:3306/metastore?createDatabaseIfNotExist=true少了个问号);二是MySQL用户没授权(GRANT ALL ON metastore.* TO 'hive'@'%' IDENTIFIED BY 'pwd'; FLUSH PRIVILEGES;);三是MySQL max_connections不够(Hive默认连接池20,10个并发查询就打满)。我在线上曾因MySQL连接数爆满,HS2日志循环打印“Unable to open a test connection”,实际是metastore服务早挂了,但HS2还在傻等。所以检查Hive,永远先看metastore.log,再看hiveserver2.log。

3. 实操命令详解与参数精调指南

3.1 HDFS启停:从单节点调试到百节点集群的渐进式验证

3.1.1 单节点伪分布式环境(开发/测试必备)
# 1. 格式化namenode(仅首次执行!重复执行会清空所有数据) hdfs namenode -format # 2. 启动HDFS(等价于 start-dfs.sh) $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode $HADOOP_HOME/sbin/hadoop-daemon.sh start datanode # 3. 验证(三步法) # a) 进程检查 jps | grep -E "NameNode|DataNode" # b) 端口检查(namenode默认9870,datanode默认9864) netstat -tuln | grep -E ":9870|:9864" # c) Web UI检查(浏览器打开) # http://localhost:9870 -> 查看Live Nodes数量 # http://localhost:9864 -> datanode的Web UI(需在datanode节点访问)

提示:hadoop-daemon.sh是底层脚本,start-dfs.sh是封装好的启动器。调试时建议用前者,因为start-dfs.sh会同时启动secondarynamenode(如果配置了),增加干扰项。

3.1.2 多节点集群启动(生产环境标准流程)
# 1. 确保所有节点时间同步(NTP是底线!) ntpdate pool.ntp.org # 或配置chronyd # 2. 在namenode节点执行(注意:不是所有节点都执行!) $HADOOP_HOME/sbin/start-dfs.sh # 3. 检查顺序(严格按此顺序,跳过一步可能误判) # Step 1: namenode日志 tail -100f $HADOOP_HOME/logs/hadoop-*-namenode-*.log | grep -E "STARTUP|Safe mode is OFF" # Step 2: 任一datanode日志(选负载最低的节点) tail -100f $HADOOP_HOME/logs/hadoop-*-datanode-*.log | grep -E "Registered|Block report" # Step 3: HDFS健康检查 hdfs dfsadmin -report | head -20 # 查看Live Nodes、Dead Nodes、Decommissioning Nodes # Step 4: 文件系统测试(创建目录+上传文件) hdfs dfs -mkdir -p /test/input echo "hello world" | hdfs dfs -put - /test/input/test.txt hdfs dfs -cat /test/input/test.txt

注意:start-dfs.sh会读取$HADOOP_HOME/etc/hadoop/slaves文件,里面每行一个datanode主机名。务必确保该文件内容与实际节点一致,且所有节点的/etc/hosts里能解析这些主机名。我遇到过slaves文件写错IP,脚本尝试SSH到不存在的IP,超时60秒后才报错,浪费大量时间。

3.1.3 安全模式强制退出(应急场景)

当namenode卡在安全模式,且确认datanode已全部上线,可手动退出:

# 方法1:等待自动退出(推荐,观察日志) # 方法2:强制退出(仅限紧急情况) hdfs dfsadmin -safemode leave # 方法3:调整安全模式阈值(永久方案) # 编辑 hdfs-site.xml,添加: <property> <name>dfs.namenode.safemode.threshold-pct</name> <value>0.95</value> <!-- 默认0.999,改为0.95表示95% block汇报即退出 --> </property> # 执行刷新:hdfs dfsadmin -refreshNodes

警告:-safemode leave是危险操作!如果datanode确实没报完block,强行退出会导致部分block丢失,后续MR job报“No live nodes contain block”。

3.2 YARN启停:资源调度器的精细化控制

3.2.1 ResourceManager单点启动(非HA模式)
# 1. 启动ResourceManager(仅在RM节点执行) $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager # 2. 启动NodeManager(在每个worker节点执行) $HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager # 3. 验证(四维检查) # a) 进程:jps | grep -E "ResourceManager|NodeManager" # b) RM端口:netstat -tuln | grep :8088 # c) NM端口:netstat -tuln | grep :8042 # d) Web UI:http://rm-host:8088/cluster -> 查看Active Nodes数量
3.2.2 YARN HA模式启动(双RM高可用)
# 1. 启动ZooKeeper集群(前提条件) zkServer.sh start # 2. 在第一个RM节点启动(自动成为Active) $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager # 3. 在第二个RM节点启动(自动成为Standby) $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager # 4. 验证HA状态 yarn rmadmin -getServiceState rm1 # 返回 active yarn rmadmin -getServiceState rm2 # 返回 standby # 5. 模拟故障切换(测试用) yarn rmadmin -transitionToStandby rm1 # 将rm1切为standby yarn rmadmin -transitionToActive rm2 # 将rm2切为active

实操心得:YARN HA依赖ZooKeeper,所以yarn.resourcemanager.zk-address必须配置正确。我曾因ZK地址写成localhost:2181(实际ZK在另一台机器),两个RM都卡在“Connecting to ZooKeeper”,日志里疯狂重试。正确写法是zk-host1:2181,zk-host2:2181,zk-host3:2181

3.2.3 NodeManager内存调优(避免OOM Killer)
# 关键参数(编辑 yarn-site.xml) <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <!-- NM可分配的最大内存,单位MB --> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>8</value> <!-- NM可分配的最大vcore数 --> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> <!-- 关闭虚拟内存检查,防OOM Killer --> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> <!-- 关闭物理内存检查 --> </property> # 生产环境建议:内存按物理内存70%计算,vcore按CPU核数*0.8计算 # 例如:32核64GB服务器 -> memory-mb=45056(64*0.7*1024), vcores=25(32*0.8)

3.3 Spark启停:从本地模式到YARN集群的无缝切换

3.3.1 Spark Standalone模式(小规模集群)
# 1. 启动Master(在master节点) $SPARK_HOME/sbin/start-master.sh # 2. 启动Worker(在每个worker节点,需SSH免密) $SPARK_HOME/sbin/start-slave.sh spark://master-host:7077 # 3. 验证 # Master Web UI: http://master-host:8080 -> 查看Workers数量 # Worker日志: $SPARK_HOME/logs/spark-*-org.apache.spark.deploy.worker.Worker-*.out # 4. 提交测试job $SPARK_HOME/bin/spark-submit \ --master spark://master-host:7077 \ --class org.apache.spark.examples.SparkPi \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.4.2.jar \ 10

注意:start-slave.sh的URL必须是spark://协议,不能是http://。如果Worker启动后Web UI不显示,检查spark-env.sh里的SPARK_MASTER_HOST是否设为master节点IP,而非localhost。

3.3.2 Spark on YARN模式(生产主力)
# 1. 确保YARN已启动(见3.2节) # 2. 配置Spark连接YARN(编辑 spark-defaults.conf) spark.master yarn spark.submit.deployMode client # 或 cluster spark.yarn.jars hdfs://namenode:9000/spark-jars/* # HDFS上的jar包路径 # 3. 上传Spark jars到HDFS(一次执行) hdfs dfs -mkdir -p /spark-jars hdfs dfs -put $SPARK_HOME/jars/*.jar /spark-jars/ # 4. 提交job(client模式:driver在提交节点运行) spark-submit \ --master yarn \ --deploy-mode client \ --class org.apache.spark.examples.SparkPi \ --executor-memory 2g \ --executor-cores 2 \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.4.2.jar \ 10 # 5. 查看YARN Application(job是否提交成功) yarn application -list | grep SPARK # 返回类似:application_1699999999999_0001 SPARK RUNNING 2023-10-01 10:00:00 user

实操技巧:client模式便于调试(driver日志在终端输出),cluster模式适合生产(driver在YARN Container内运行,提交节点断开不影响job)。但cluster模式下,driver日志需用yarn logs -applicationId application_xxx查看,比client模式多一步。

3.4 Hive启停:元数据服务的稳定性保障

3.4.1 Metastore独立部署(生产推荐)
# 1. 启动Metastore(后台运行,日志重定向) nohup hive --service metastore > /var/log/hive/metastore.log 2>&1 & # 2. 验证Metastore(检查端口和日志) netstat -tuln | grep :9083 # 默认thrift端口 tail -50f /var/log/hive/metastore.log | grep "Starting DBStore" # 3. 启动HiveServer2(HS2) nohup hiveserver2 > /var/log/hive/hiveserver2.log 2>&1 & # 4. 验证HS2 netstat -tuln | grep :10000 # 默认thrift端口 tail -50f /var/log/hive/hiveserver2.log | grep "HiveServer2 started" # 5. 测试连接(用beeline CLI) beeline -u jdbc:hive2://hs2-host:10000 -n hiveuser -p hivepass # 进入后执行:show databases;

注意:hive --service metastorehiveserver2命令本质是Java进程,所以nohup后必须加&,否则会前台阻塞。如果忘记加&,Ctrl+C中断后进程其实还在,要用ps aux | grep metastore杀掉。

3.4.2 Hive配置关键参数(避坑清单)
<!-- hive-site.xml 必配项 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://mysql-host:3306/metastore?createDatabaseIfNotExist=true&amp;useSSL=false&amp;serverTimezone=UTC</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hivepassword</value> </property> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://metastore-host:9083</value> <!-- HS2连接metastore的地址 --> </property>

常见错误:useSSL=falseserverTimezone=UTC必须加上,否则MySQL 8.0+连接失败;&在XML中要写成&amp;,否则配置解析失败;hive.metastore.uris必须指向metastore服务地址,不能写localhost(HS2和metastore通常不在同一台机器)。

4. 故障排查实战:从日志碎片到根因定位

4.1 HDFS典型故障速查表

现象日志关键词根因分析解决方案
namenode处于安全模式Safe mode is ONdatanode未完成block report检查datanode日志是否有Block report,确认网络连通性
datanode无法注册到namenodeCall From dn-host to nn-host:9820 failednamenode未监听9820端口,或防火墙拦截netstat -tuln | grep :9820iptables -L -n
hdfs dfs -ls 报错 Connection refusedjava.net.ConnectException: Connection refusednamenode进程未启动,或core-site.xml的fs.defaultFS配置错误jps | grep NameNode,检查fs.defaultFS=hdfs://namenode-host:9000
DataNode: java.io.IOException: Incompatible clusterIDsIncompatible clusterIDsdatanode的VERSION文件clusterID与namenode不匹配删除datanode的data目录,重新格式化namenode

实操心得:HDFS日志里最有效的线索不是ERROR,而是INFO级别的状态流转。比如namenode日志里连续出现BLOCK* NameSystem#addBlock: block ... added,说明block写入正常;如果突然停止,大概率是datanode挂了。我习惯用grep -A 5 -B 5 "Exception\|FATAL" hadoop-hdfs-namenode-*.log抓上下文,比单纯搜ERROR更准。

4.2 YARN资源调度故障定位

现象日志关键词根因分析解决方案
yarn application -list 返回空No applications foundResourceManager未启动,或yarn.resourcemanager.address配置错误jps | grep ResourceManager,检查yarn.resourcemanager.address=rm-host:8032
NodeManager反复退出Killed processLinux OOM Killer干掉NM进程调小yarn.nodemanager.resource.memory-mb,或关闭内存检查
spark-submit卡住,无日志输出Client: Waiting for applicationYARN资源不足,或spark.yarn.jars路径错误yarn node -list看节点状态,hdfs dfs -ls /spark-jars确认jar存在
ApplicationMaster启动失败AM Container exited with exitCode: -1000Container内存超限,或本地磁盘空间不足yarn logs -applicationId app_xxx看AM日志,检查yarn.nodemanager.local-dirs磁盘使用率

排查技巧:YARN的Application日志分散在多个地方。Driver日志在提交节点(client模式)或AM Container(cluster模式);Executor日志在对应NodeManager节点的$YARN_HOME/logs/userlogs目录。最快方法是yarn logs -applicationId application_xxx > app.log,然后grep -E "ERROR\|Exception" app.log

4.3 Spark on YARN作业失败诊断链

Spark job失败不是单一环节问题,而是YARN调度→Container启动→Executor初始化→Task执行的链条断裂。我的标准排查链:

  1. YARN层yarn application -status application_xxx→ 看FinalStatus是SUCCEEDED还是FAILED
  2. AM层yarn logs -applicationId application_xxx \| grep "ApplicationMaster"→ 看AM是否启动成功
  3. Executor层yarn logs -applicationId application_xxx \| grep "Executor"→ 看Executor是否注册
  4. Task层yarn logs -applicationId application_xxx \| grep "TaskSetManager"→ 看Task是否调度

常见断点:

  • AM启动失败:通常是spark.yarn.jars路径不存在,或HDFS权限问题(hdfs dfs -ls /spark-jars返回Permission denied)
  • Executor注册失败:spark.executor.memory设得太大,YARN分配Container时超限,日志报Requested container exceeds memory limits
  • Task失败:spark.sql.files.maxPartitionBytes设得太小,产生海量小task,拖垮调度器

4.4 Hive元数据服务崩溃复原

Hive故障90%出在Metastore。当beeline连不上,按此顺序检查:

  1. 网络层telnet metastore-host 9083→ 端口不通?检查metastore进程、防火墙、SELinux
  2. Metastore层tail -100f /var/log/hive/metastore.log→ 找ExceptionConnection refused
  3. MySQL层mysql -uhive -phivepass -h mysql-host -e "use metastore; show tables;"→ 连接失败?检查MySQL服务、用户权限、max_connections
  4. HS2层tail -100f /var/log/hive/hiveserver2.log→ 如果metastore正常但HS2报错,可能是hive.metastore.uris配置错误

紧急恢复:如果MySQL损坏,Hive元数据不可逆丢失。唯一办法是从备份恢复MySQL库。所以生产环境必须每天mysqldump -u hive -p hivepass metastore > /backup/metastore_$(date +%F).sql,并验证备份可还原。

5. 高级运维技巧:自动化启停与健康巡检

5.1 一键启停脚本(适配多节点集群)

#!/bin/bash # cluster-control.sh # Usage: ./cluster-control.sh {start|stop} {hdfs|yarn|spark|hive} SERVICE=$2 ACTION=$1 case $SERVICE in hdfs) if [ "$ACTION" = "start" ]; then echo "Starting HDFS..." $HADOOP_HOME/sbin/start-dfs.sh sleep 10 hdfs dfsadmin -report | head -10 else echo "Stopping HDFS..." $HADOOP_HOME/sbin/stop-dfs.sh fi ;; yarn) if [ "$ACTION" = "start" ]; then echo "Starting YARN..." $HADOOP_HOME/sbin/start-yarn.sh sleep 10 yarn node -list else echo "Stopping YARN..." $HADOOP_HOME/sbin/stop-yarn.sh fi ;; hive) if [ "$ACTION" = "start" ]; then echo "Starting Hive Metastore..." nohup hive --service metastore > /var/log/hive/metastore.log 2>&1 & sleep 5 echo "Starting HiveServer2..." nohup hiveserver2 > /var/log/hive/hiveserver2.log 2>&1 & else echo "Stopping Hive..." ps aux | grep "metastore" | grep -v grep | awk '{print $2}' | xargs kill -9 ps aux | grep "hiveserver2" | grep -v grep | awk '{print $2}' | xargs kill -9 fi ;; esac

使用方式:./cluster-control.sh start hdfs启动HDFS,./cluster-control.sh stop hive停止Hive。脚本加入sleep和状态检查,避免启停不同步。

5.2 集群健康巡检脚本(每日自动执行)

#!/bin/bash # health-check.sh # 检查HDFS/YARN/Spark/Hive核心指标 echo "=== HDFS Health Check ===" hdfs dfsadmin -report | grep -E "Live Nodes|Dead Nodes|Decommissioning Nodes" hdfs fsck / -files -blocks -locations 2>/dev/null | head -10 echo "=== YARN Health Check ===" yarn node -list | grep -E "Total Nodes|RUNNING" yarn application -list -appStates RUNNING | wc -l echo "=== Spark on YARN Check ===" if yarn application -list 2>/dev/null | grep -q "SPARK"; then echo "Spark jobs running" else echo "No Spark jobs running" fi echo "=== Hive Metastore Check ===" nc -z metastore-host 9083 && echo "Metastore OK" || echo "Metastore DOWN" echo "=== HiveServer2 Check ===" nc -z hs2-host 10000 && echo "HS2 OK" || echo "HS2 DOWN"

部署:crontab -e添加0 2 * * * /path/to/health-check.sh >> /var/log/cluster-health.log 2>&1,每天凌晨2点执行。

5.3 生产环境启停黄金法则

  1. 启停顺序不可逆:启动按HDFS→YARN→Hive→Spark;停止按Spark→Hive→YARN→HDFS。原因:Spark依赖YARN,YARN依赖HDFS,Hive依赖HDFS和MySQL。反序启停会导致服务等待超时。
  2. 滚动重启策略:百节点集群不要stop-all.sh,而是逐台重启NodeManager:先yarn-daemon.sh stop nodemanager,等该节点所有Container结束,再start。避免瞬间资源缺口。
  3. 配置版本管理:所有core-site.xml等配置文件用Git管理,每次修改提交commit,并在注释里写明变更原因(如“2023-10-01 调整dfs.blocksize为256MB,适配大文件场景”)。
  4. 日志保留策略:Hadoop日志默认只存最近10个,生产环境改$HADOOP_HOME/etc/hadoop/log4j.propertieshadoop.root.logger=INFO,RFAlog4j.appender.RFA.MaxBackupIndex=30,保留30天日志。

我在某金融客户现场,曾因未遵守启停顺序,先停了HDFS再停YARN,导致YARN的Application状态丢失,所有正在运行的Spark job被强制kill,业务方投诉。后来我们把启停流程固化成Ansible Playbook,每次执行前自动校验依赖状态,再也没出过问题。技术细节决定成败,而流程规范保障稳定。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 22:56:59

PHP原生类在XSS中的妙用:从Exception到文件路径注入

BJDCTF 2nd 里有一道让我印象很深的 web 题&#xff0c;叫 xss之光。名字听着有点玄&#xff0c;实际属于那种“以为是考前端 XSS&#xff0c;结果把 PHP 原生类翻了个底朝天”的题。题目本身不长&#xff0c;但把两个知识点串得特别紧&#xff1a;一是 PHP 原生类里Exception的…

作者头像 李华
网站建设 2026/9/16 22:56:58

书霸AI|书霸AI官网www.shubaai.com|微信公众号搜一搜 书霸AI写作

下午三点&#xff0c;办公室里只剩键盘声。小林盯着文档中的一句话&#xff1a;“本文研究短视频对大学生学习行为的影响。”题目看起来完整&#xff0c;但导师留下的批注很直接&#xff1a;范围太大&#xff0c;变量不清&#xff0c;研究对象也没有边界。这类卡顿在期刊论文写…

作者头像 李华
网站建设 2026/9/16 22:55:06

家庭电脑远程唤醒实战指南:WOL+公网IP配置全解析

1. 这不是“远程控制”&#xff0c;而是让家里那台沉睡的电脑自己醒过来你有没有过这样的经历&#xff1a;人在外地&#xff0c;突然想起家里电脑上存着一份没备份的设计稿&#xff0c;或者一段还没导出的视频剪辑&#xff1b;想用手机连上去取个文件&#xff0c;却发现电脑根本…

作者头像 李华
网站建设 2026/9/16 22:53:51

MCLAG双活接入技术详解:原理、配置与故障排错实践

1. 两台交换机只能跑STP吗——接入双归的带宽困境我在一次汇聚层设备割接中碰上了这个经典难题&#xff1a;核心下挂的两台汇聚交换机要升级&#xff0c;但业务完全不能断。最常规的方案无非两种&#xff0c;一是靠STP&#xff08;生成树协议&#xff09;做冗余&#xff0c;备链…

作者头像 李华