ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Hadoop 速刷:HDFS / MR / YARN / Spark / Hive

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 损坏块

  1. 读时发现坏块:IBR 上报,等待 DN 心跳 (3s) 触发副本重建
  2. 长期未读:块扫描器默认21 天才发现坏块
  3. 全部副本损坏:不能自动修复

人工: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

任务失败排查

  1. RM 页面拿 applicationId,区分FAILED / KILLED
  2. 优先看 AM 日志:区分初始化失败 or Task 运行失败
  3. Task 失败看 Container stderr
    • KILLED:人为kill、内存超限 OOM、NM 本地磁盘满、资源抢占、AM 心跳超时
    • FAILED:代码 bug、脏数据、序列化、Shuffle、HDFS 权限 / 路径
  4. 辅助: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,生产推荐

高频异常:

  1. Container killed exceeding memory limits:executor 内存 /memoryOverhead 不足,排查数据倾斜
  2. FetchFailedException:Shuffle 拉取失败;检查 NM 磁盘、节点健康、网络
  3. NotSerializableException:闭包引用不可序列化对象
  4. Driver OOM:collect 拉大量数据、广播大变量

五、Hive

  1. MapJoin:小表做 hash join;小表过大内存溢出,调阈值或走 Reduce Join
  2. 脏数据:配置参数把转换异常置 null,防止任务失败
  3. 表找不到:表名写错、底层 HDFS 数据被删、依赖视图源表删除

六、易混点速对比

  1. Combiner:不改变 key,局部聚合,不能打散热点
  2. Salting 加盐:改变 key,打散热点,两轮聚合
  3. FAILED:业务逻辑异常;KILLED:YARN 强制杀死(内存 / 磁盘 / 抢占)

七、自测Q&A

  1. 心跳与块报告区别?块报告包含哪些?
  2. HDFS 全部副本损坏怎么处理?
  3. DN 磁盘满和 NN 元数据磁盘满现象及处理?
  4. MR Shuffle 流程,Combiner 作用与限制?
  5. 数据倾斜现象、原因,加盐原理?
  6. YARN 任务失败排查步骤,FAILED 和 KILLED 区别?
  7. InputSplit 和 Block 区别,小文件危害和处理?
  8. Spark FetchFailed 异常原因?
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进