常问面试题

张开发
2026/4/9 2:39:13 15 分钟阅读

分享文章

常问面试题
一、hdfs故障解决第一步确定数据是否安全我首先会在 Ambari 的 HDFS 服务界面确认DataNode 的状态通常会显示为“Heartbeat Lost”或“Stopped”。两个核心指标Under Replicated Blocks副本不足块和Missing Blocks丢失块。只要Missing Blocks为零就说明数据是安全的集群会自动恢复数据。我会登录到行hdfs dfsadmin -report确认 NameNode 已将这三个节点标记为“Dead”并用hdfs fsck /命令检查集群的整体健康状况。第二步解决具体节点服务挂检查节点/var/log/hadoop-hdfs/目录下的 DataNode 日志用grep -i error|exception快速定位问题。如果是进程意外退出比如日志里有 OOM内存溢出错误我会检查jps进程状态然后尝试直接重启 DataNode 服务。如果是磁盘已满我会用df -h确认然后清理不必要的日志文件再重启服务。如果是网络中断或硬件永久性故障导致节点无法恢复那就不能强行上线需要进入下一步的退役流程。第三步执行恢复保障数据安全对于临时性故障在 Ambari 界面上直接重启 DataNode 组件。服务启动后NameNode 会自动检测到新节点并开始数据平衡。对于永久性故障得在 Ambari 的 Hosts 页面对故障节点执行“Decommission”退役操作。这会触发 NameNode 将该节点上的所有数据块按照副本策略默认是3副本复制到其他健康的 DataNode 上确保数据不丢失。第四步最终验证闭环确认最后回到 Ambari 界面和命令行进行最终验证。核心是确认Under Replicated Blocks和Missing Blocks的数值都回归到 0并且hdfs dfsadmin -report显示所有 DataNode 都处于健康“Live”状态。只有当这些指标全部正常集群确认完全恢复稳定。二、yarn故障解决1、首先登录Ambari 控制台查看 YARN 服务确认这 3 个 NodeManager 的状态是Heartbeat Lost心跳丢失还是Stopped已停止。 再去yarn界面看Running Containers运行中的容器数量是否骤降以及是否有大量任务因节点丢失而失败。这能帮助我判断是单纯的进程故障还是引发了连锁反应。2、 登录到故障节点从两个维度进行排查查日志重点搜索ERROR或Exception看是否有内存溢出、磁盘空间不足特别是日志目录或本地缓存目录满了或网络连接超时的报错。查资源使用df -h查磁盘使用率使用free -m查内存剩余。很多时候 NodeManager 挂掉是因为所在节点的磁盘满了导致无法写入容器日志或临时数据。3、恢复操作场景一临时性故障进程崩溃/资源抖动如果硬件和网络正常进程意外退出我会直接在Ambari 界面上重启NodeManager 会重新向 ResourceManager 注册恢复服务。场景二磁盘满或配置错误如果是磁盘满了我会先清理不必要的日志文件或扩大磁盘配额确保低于 YARN 的健康检查阈值通常是 90%然后再重启服务。场景三硬件永久故障如果节点无法修复为了防止 ResourceManager 继续向该故障节点调度任务我会在 Ambari 中将该节点置入维护模式或从集群中移除确保调度器不再分发任务给它。4. 验证与闭环恢复操作后我会回到 Ambari 界面确认 NodeManager 的状态已变回绿色的Started。同时会观察一段时间确保没有新的任务报错且yarn集群的核数和内存资源总量恢复正常。三、spark和flink(Application模式)任务提交流程⚡ Spark 任务提交流程以 Yarn Cluster 模式为例Spark 的提交流程核心在于Driver的生命周期管理Driver 既是“大脑”也是“指挥官”。提交应用客户端提交任务Yarn 启动ApplicationMaster即 Spark Driver。申请资源Driver 向 ResourceManager 申请第一个 Container 来启动Executor。启动执行Executor 启动后向 Driver 反向注册Driver 将代码和任务分发到 Executor。任务调度Driver 的 DAGScheduler 将代码划分为 StageTaskScheduler 将 Task 发送给 Executor 执行。结果返回Executor 执行完毕后释放资源Driver 汇总结果并关闭应用。关键点Spark 是“Driver 在集群端”Driver 负责指挥全局资源申请到位后分发 Task。 Flink 任务提交流程Application 模式Flink 的提交流程核心在于JobManager和Slot的分配且 main 方法在集群端执行。提交任务客户端仅提交 JAR 包和配置不执行 main 方法。启动集群Yarn 启动JobManagerFlink 的主节点。执行 main 方法JobManager 负责执行用户代码的 main 方法生成 JobGraph 并提交给 Dispatcher。申请资源JobManager 向 Yarn 申请 Container 来启动TaskManager。分配槽位TaskManager 启动后向 JobManager 注册并汇报可用的Slot计算资源槽位。部署执行JobManager 将任务调度到具体的 Slot 中运行。关键点Flink Application 模式将 main 方法的执行转移到了 JobManager减轻了客户端压力且资源分配基于 Slot 机制。 核心差异对比表特性Spark (Yarn Cluster)Flink (Application Mode)核心主控Driver (ApplicationMaster)JobManagerMain 方法执行位置Driver (集群端)JobManager (集群端)资源单位Executor (容器)Slot (线程级隔离)提交流程客户端 - AppMaster(Driver) - Executor客户端 - JobManager(执行main) - TaskManager调度时机资源申请到位后分发 Task任务提交后动态调度到 Slot四、spark和flink任务常见问题*saprk任务常见问题1. 任务提交失败或卡住问题现象任务一直处于ACCEPTED状态或提交即报错。排查思路查资源队列检查 YARN 队列资源是否已满yarn node -list或队列 权限是否受限。查依赖冲突若报ClassNotFoundException检查 JAR 包是否缺失或通过--jars正确引入。2. 内存溢出 (OOM) 与容器被杀问题现象日志报Java heap space或Exit Code 137。排查思路Driver OOM通常因collect()拉取过多数据。解决调大spark.driver.memory避免全量拉取。Executor OOM通常因 Shuffle 数据量大或数据倾斜。解决调大spark.executor.memory开启堆外内存spark.memory.offHeap.enabledtrue。3. 任务运行慢或长尾效应问题现象Stage 进度卡在 99%或个别 Task 耗时极长。排查思路数据倾斜查看 Spark UI 的 Stage 详情页寻找长尾任务。解决开启自适应查询执行spark.sql.adaptive.enabledtrue或加盐处理。小文件过多读取大量小文件导致 Task 启动开销大。解决使用coalesce合并文件。*flink任务常见问题1. 反压 (Backpressure) 严重问题现象Flink Web UI 显示算子反压状态为HIGH数据积压。排查思路定位瓶颈通过 Web UI 找到反压源头通常是 Sink 端或聚合算子。优化算子增加并行度优化 I/O 逻辑如使用异步 I/O或开启微批处理MiniBatch。2. Checkpoint 失败或超时问题现象日志报Checkpoint expired或declined。排查思路状态过大RocksDB 状态文件太大导致上传超时。解决开启增量 Checkpointstate.backend.rocksdb.incrementaltrue。对齐耗时数据倾斜导致 Barrier 对齐慢。解决开启非对齐 CheckpointUnaligned Checkpoints。3. TaskManager 频繁重启问题现象日志报OutOfMemoryError: Direct buffer memory或容器被杀。排查思路内存配置检查taskmanager.memory.process.size是否满足需求。网络缓冲若报Network buffer相关错误需调大taskmanager.network.memory.fraction五、mr查询引擎的三个阶段1、map阶段从hdfs读取数据转换成键值对先写入内存达到阈值后排序再落盘map阶段结束数据落盘2、shuffle阶段将相同的key从各个本地磁盘发送到同一个reduce节点并分区排序3、reduce阶段接收shuffle阶段传来的分组数据。调用reduce()函数将相同key的value值进行聚合计算最终结果写入到hdfs六、spark为什么比mr快1、mr必须在map阶段结束后数据数据必须写次磁盘shuffle阶段必须读磁盘spark中间结果优先缓存在内存中且支持流水线执行大幅减少了磁盘 I/O2、MapReduce 每启动一个map或者reduce任务都会启动一个新的jvm进程JVM 启动开销大Spark 的executor是常驻的jvm进程。任务是以线程方式在executor运行任务切换只需要切换线程。

更多文章