Hadoop 速刷:HDFS / MR / YARN / Spark / Hive
一、HDFS
1.1 心跳 vs 块报告
- 心跳:3s 一次,上报DN存活状态、磁盘容量,不带块
- 块报告:全量 FBR 默认 6h,上报 DN 上全部 block 清单;增量 IBR(Incremental Block Report) 块新增/删除即时上报
- 块报告内容:blockId、genStamp(块副本的版本号,NameNode 生成,单调递增,用来区分同一个 BlockId 下,新旧版本的数据块副本。
blockId是块的唯一 ID,但是同一个 blockId 可能产生多个副本版本,靠 genStamp 区分)、块长度、状态、storageUUID(存储卷 UUID);无文件名
| 项目 | Heartbeat 心跳 | IBR 增量块汇报 | FBR 全量块汇报 |
|---|---|---|---|
| 频率 | 3 秒一次 | 块变更时触发(新增 / 删除块) | 默认 6 小时一次 |
| 携带内容 | DN 存活、磁盘容量;不带 block | 只上报发生变化的 block | 上报 DN 全部 block 列表 |
| 数据量 | 很小,轻量 RPC | 小,增量 | 非常大,大集群开销高 |
| 核心作用 | 保活、磁盘资源上报,NN 下发指令 | 实时同步块变更元数据 | NN 重建全量块元数据 |
1.2 损坏块
- 读时发现坏块:IBR 上报,等待 DN 心跳 (3s) 触发副本重建
- 长期未读:块扫描器默认21 天才发现坏块
- 全部副本损坏:不能自动修复
人工:fsck 定位 → 检查 DN 是否离线 → 快照 / 备份恢复 → 可移至 lost+found;确认无用再 delete,禁止
fsck / -delete
1.3 DN 磁盘满
卷标记 full,可读不可写;集群满:读正常,写 / 复制 / 均衡失败;极端情况 DN 崩溃。
处理:
hdfs dfsadmin -report;清理 + expunge 清空回收站;扩磁盘 / DN,balancer;可降副本。
1.4 NN 元数据磁盘满
edits 写失败,NN 直接宕机,集群不可用。
处理:停集群;只清日志临时文件,严禁删 fsimage/edits;释放空间启动;迁移 name.dir 到大磁盘;控制 fsimage 保留份数。HA 需关注 JournalNode 磁盘。
1.5 非‑HA NN 宕机
停止集群 → 确认元数据完整 → fsimage+edits 恢复 → 启动 NN → 等待 DN 注册上报块报告 → 退出安全模式 → fsck 校验。
二、MapReduce
2.1 MR 流程
Input → Map →Shuffle (Map 端溢写合并 + Reduce 端拷贝归并排序)→ Reduce → Output
- 环形缓冲区:100MB,80% 触发溢写磁盘
- Combiner:Map 端局部聚合,减少 IO;满足交换律结合律;不保证一定执行,不能依赖做业务
- Partition:分区数 = Reduce 任务数
- InputSplit:逻辑分片;Block:物理块;1 个 split 对应 1 个 MapTask
2.2 数据倾斜
现象:大部分 task 跑完,个别 task 很慢,卡在 99%。
原因:key 分布不均,大量数据落到同一个 Reduce。
MR 方案:combiner、加盐(salting)、自定义分区、业务预处理。
2.3 加盐 Salting
给热点 key 加随机前缀打散,第一轮局部聚合;第二轮去盐全局聚合。
group‑by:两轮聚合;join:小表需要同步膨胀;代价:多一轮 Shuffle。
2.4 小文件
危害:大量 MapTask,JVM 与调度开销巨大。
解决:CombineFileInputFormat、HAR、预处理合并。
2.5 MR1 vs MR2(YARN)
- MR1:JobTracker 单点,资源调度 + 任务管理
- MR2‑YARN:RM 管资源,NM 管节点,每个作业独立 AM;MR 只是 YARN 上框架
三、YARN
任务失败排查
- RM 页面拿 applicationId,区分FAILED / KILLED
- 优先看 AM 日志:区分初始化失败 or Task 运行失败
- Task 失败看 Container stderr
- KILLED:人为kill、内存超限 OOM、NM 本地磁盘满、资源抢占、AM 心跳超时
- FAILED:代码 bug、脏数据、序列化、Shuffle、HDFS 权限 / 路径
- 辅助:
yarn node -list -all看节点 UNHEALTHY;检查队列、HDFS
⚠️磁盘区分:
HDFS 盘:业务数据;
NM 本地盘:容器临时、Shuffle 中间文件;
No space left on device大多是 NM 本地盘满。
四、Spark on YARN
- yarn‑client:Driver 在提交客户端,客户端断开 Driver 挂
- yarn‑cluster:Driver 跑 YARN 容器 AM,生产推荐
高频异常:
Container killed exceeding memory limits:executor 内存 /memoryOverhead 不足,排查数据倾斜FetchFailedException:Shuffle 拉取失败;检查 NM 磁盘、节点健康、网络NotSerializableException:闭包引用不可序列化对象- Driver OOM:collect 拉大量数据、广播大变量
五、Hive
- MapJoin:小表做 hash join;小表过大内存溢出,调阈值或走 Reduce Join
- 脏数据:配置参数把转换异常置 null,防止任务失败
- 表找不到:表名写错、底层 HDFS 数据被删、依赖视图源表删除
六、易混点速对比
- Combiner:不改变 key,局部聚合,不能打散热点
- Salting 加盐:改变 key,打散热点,两轮聚合
- FAILED:业务逻辑异常;KILLED:YARN 强制杀死(内存 / 磁盘 / 抢占)
七、自测Q&A
- 心跳与块报告区别?块报告包含哪些?
- HDFS 全部副本损坏怎么处理?
- DN 磁盘满和 NN 元数据磁盘满现象及处理?
- MR Shuffle 流程,Combiner 作用与限制?
- 数据倾斜现象、原因,加盐原理?
- YARN 任务失败排查步骤,FAILED 和 KILLED 区别?
- InputSplit 和 Block 区别,小文件危害和处理?
- Spark FetchFailed 异常原因?