
1) 【一句话结论】高可用Hadoop集群通过NameNode HA(ZKFC或QJN实现Active/Standby切换)与DataNode故障转移(心跳检测+数据迁移)保障服务连续性;Spark作业通过检查点(保存中间状态)与任务重试(失败重试+重调度)实现容错与恢复。
2) 【原理/概念讲解】老师:先讲NameNode HA的核心是避免单点故障,通过双机热备模式。具体来说,Active NameNode处理所有HDFS操作,Standby作为备份,通过ZooKeeper Failover Controller(ZKFC)监控Active状态。ZKFC会监听ZooKeeper中名为“activestandby.service/hadoop-ha”的状态节点,当Active NameNode故障时,ZKFC触发Standby切换,整个过程依赖ZooKeeper的watch机制,切换速度通常在秒级(类比“心跳检测+快速切换”,像两个服务器同时运行,心跳正常时Active工作,心跳中断时Standby立即接管)。再讲DataNode故障转移:DataNode定期向NameNode发送心跳(默认每3秒一次),若NameNode在超时时间(如10分钟)内未收到心跳,会标记该节点为故障。此时,NameNode会启动数据迁移流程,优先迁移热数据(即当前正在被访问的数据块,因为热数据丢失影响更大),冷数据可稍后迁移。迁移时,NameNode会从故障节点的副本中复制数据到其他DataNode,确保数据副本数量满足HDFS的副本因子要求(如副本因子为3时,故障节点数据至少有2个副本在其他节点,迁移后副本数恢复)。然后讲Spark容错:检查点机制是Spark作业执行时,定期将中间RDD(如Map阶段的输出)保存到持久化存储(如HDFS),作业失败时,从检查点恢复中间状态,重新执行未完成的分区(类比“保存作业进度”,避免从头开始,适合长作业,如ETL任务,中间状态可能很大)。任务重试机制是任务执行失败后,自动重试(默认3次),若重试后仍失败,则重调度到其他Executor(即任务被分配到其他工作节点执行),确保任务最终完成(类比“任务失败后自动补救”,适合短作业,如实时计算,任务失败概率较低,但可能增加系统负载)。
3) 【对比与适用场景】
| 方案/机制 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| NameNode HA方案 | ||||
| ZKFC | ZooKeeper Failover Controller | 依赖ZooKeeper集群,通过状态节点监控Active/Standby状态,故障时触发切换;切换速度快(秒级) | 小规模至中型集群(节点数<100),且ZooKeeper集群稳定 | 需ZooKeeper服务可靠,配置简单,但切换速度受ZooKeeper性能影响 |
| QJN | Quorum Journal Node | 由多个JournalNode组成Quorum,通过多副本保证数据一致性,Active/Standby切换依赖JournalNode日志同步;切换速度较慢(分钟级) | 大规模集群(节点数>100),需要高数据一致性 | 配置复杂,需要多JournalNode,切换时需同步日志,适合对数据一致性要求高的场景 |
| Spark容错机制 | ||||
| 检查点 | 定期保存中间RDD状态到持久化存储 | 作业失败→从检查点恢复状态→重新执行未完成任务 | 长作业(如ETL、数据转换,中间状态大,失败后恢复时间较长) | 需额外存储资源,检查点频率设置需平衡存储成本与恢复效率(如每10个分区保存一次) |
| 任务重试 | 任务失败后自动重试(默认3次),仍失败则重调度 | 失败任务重试→仍失败→重调度到其他Executor | 短作业(如实时计算、小规模数据处理,任务失败概率低) | 可能导致资源浪费,增加系统负载,重试次数设置需避免无限循环 |
4) 【示例】
NameNode HA配置示例(基于ZKFC,假设ZooKeeper集群已部署):
# zookeeper配置(zoo.cfg)
quorum.server.1=zk1:2888:3888
quorum.server.2=zk2:2888:3888
quorum.server.3=zk3:2888:3888
# hdfs-site.xml配置
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hadoop-ha</value>
</property>
<property>
<name>dfs.ha.namenodes.hadoop-ha</name>
<value>hdn1,hdn2</value>
</property>
<property>
<name>dfs.ha.storage.dir</name>
<value>hdfs://hadoop-ha/hdfs/namenode/hdn1/edits,hdfs://hadoop-ha/hdfs/namenode/hdn2/edits</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.user</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-file</name>
<value>/etc/hadoop/conf/ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.hosts</name>
<value>hdn1,hdn2</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.command</name>
<value>ssh -o StrictHostKeyChecking=no -i /etc/hadoop/conf/ssh/id_rsa %u@$HOST kill -9 %p</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdn1</name>
<value>hdn1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdn2</name>
<value>hdn2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hdn1</name>
<value>hdn1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hdn2</name>
<value>hdn2:50070</value>
</property>
</configuration>
# 启动步骤
1. 格式化NameNode(需确保HA存储目录存在且权限正确):
hdfs namenode -format -namenode hdn1
hdfs namenode -format -namenode hdn2
2. 启动NameNode HA:
hdfs namenode -bootstrap-active-namenode hdn1
hdfs haadmin -bootstrap-active-namenode hdn1
3. 验证HA状态:
hdfs haadmin -status
5) 【面试口播版答案】
面试官您好,关于高可用Hadoop集群的设计,核心是通过NameNode HA(ZKFC或QJN实现Active/Standby切换)与DataNode故障转移(心跳检测+数据迁移)保障服务连续性;Spark作业通过检查点(保存中间状态)与任务重试(失败重试+重调度)实现容错与恢复。具体来说,Hadoop NameNode HA采用双机热备模式,Active NameNode处理所有HDFS操作,Standby作为备份,通过ZooKeeper Failover Controller(ZKFC)监控Active状态,当Active故障时,ZKFC触发Standby切换,切换速度秒级,适合小规模集群;DataNode故障转移则通过心跳检测,故障节点数据优先迁移热数据(当前访问的数据),冷数据稍后迁移,确保数据副本满足副本因子要求。Spark作业容错方面,检查点机制定期保存中间状态到HDFS,作业失败时从检查点恢复,避免从头开始,适合长作业;任务重试机制对失败任务自动重试3次,仍失败则重调度,确保任务完成,适合短作业。这样,Hadoop集群高可用,Spark作业也能可靠运行。
6) 【追问清单】
7) 【常见坑/雷区】