数据岗位面试题更新 2026-08-05

在 MapReduce 框架里,当一个任务需要多个作业按顺序执行且前一个作业的输出作为后一个作业的输入时,通常采用哪些机制来编排这些作业并传递中间数据?请说明常见的依赖管理方式和数据流动方案。

数据系统设计方案权衡HDFS

考察说明

考察对 MapReduce 多作业工作流编排及数据传递机制的理解。

回答思路

  1. 【回答框架 1】依赖管理通常通过工作流调度器实现,如 Azkaban、Oozie 或 Airflow,它们以 DAG 方式定义作业间的依赖关系,按拓扑顺序执行并处理失败重试。
  2. 【回答框架 2】数据流动的核心是分布式文件系统(如 HDFS),前一作业的输出作为中间结果写入 HDFS,后一作业读取该路径作为输入,实现跨作业数据传递。
  3. 【回答框架 3】也可使用链式 MapReduce 或组合器减少中间数据量,或通过 DistributedCache 分发小文件或配置,但大体积中间数据仍需通过文件系统。
  4. 【回答框架 4】实际大规模场景中,会考虑数据本地性和中间数据清理策略,避免存储膨胀,并利用压缩或列式格式优化读写效率。
  5. 【回答框架 5】对于迭代式或流式需求,可基于 Spark 或 Flink 等内存计算框架替代,减少频繁磁盘 I/O,但需权衡集群资源和作业粒度。
  6. 【关键点 1】依赖关系通常由 DAG 调度器(如 Oozie、Azkaban)管理,支持按时序执行和失败重试。
  7. 【关键点 2】作业间数据通过共享文件系统传递,典型为 HDFS,前驱输出目录作为后继输入。
  8. 【关键点 3】调度器需处理中间数据清理和版本管理,避免覆盖和存储溢出。
  9. 【易错点 1】不要忽略中间数据清理,否则长期运行会占满集群存储。
  10. 【易错点 2】避免将大量中间数据通过 DistributedCache 传递,它只适合小文件且是复制分发。
  11. 【易错点 3】DAG 调度默认按时间触发,不保证物理数据就绪,需显式依赖前驱成功状态。