YARN容错机制

本文详细介绍了YARN中任务、ApplicationMaster、NodeManager及ResourceManager的容错处理机制。当任务失败时,如MapTask或ReduceTask异常,YARN会重新调度任务,避免在同一NodeManager上重试。ApplicationMaster有最大尝试次数,失败后可恢复作业状态。NodeManager失败会导致任务重新分配,ResourceManager的失败则是集群的致命问题,需要高可用配置。

  在现实情况中,用户代码错误不断,进程奔溃,机器故障等等。使用hadoop的好处之一就是可以它能处理这类故障并成功完成任务。需要考虑的实体失败任务为:任务(job),Application Master,NodeManager和ResourceManager。

任务失败

可能存在以下情况:

  1. MapTask或者ReduceTask中由于代码原因抛出异常,jvm在关闭之前,会通知mrAppMaster这个task任务失败,在mrAppMaster中,错误报告被写入到用户日志并且任务标记为失败,并释放jvm资源,供其他任务使用。对于streaming任务,如果streaming进程以非0退出代码退出,则被标记为失败。这种行为由stream.non.zero.is.failure属性(默认值为true)控制
  2. jvm突然退出,可能是由于jvm缺陷而导致mr用户代码由于某种特殊原因造成jvm退出。nodeManage会将这消息通知到mrAppMaster,标记此次任务失败
  3. 任务挂起(可能是由于资源不足造成):一旦mrAppMaster一段时间没有接收到进度的更新,则将任务标记为失败,nodeManager会将该jvm进程杀死。任务失败时长可以由mapreduce.task.timeout来设置。如果为0 ,则表示关闭。如果关闭这个属性,那么可能会造成长时间运行的任务不会被标记为失败,被挂起的任务就会一直不被释放资源,长时间会造成集群效率降低,因此尽量避免这个设置。同时充分保证每个任务定期更新进度。

处理:当mrAppMaster被告知,一个任务失败的时候,会重新调度该任务。mrAppMaster会尝试避免在以前失败过的nodeManager重新调度该任务。此外,一个任务失败的次数超过4次,将不会再重新调度。这个数值由mapreduce.map.maxattempts控制。如果一个任务失败次数大于该属性设置的,则整个作业都会失败。对于一些应用程序中,不希望少部分任务失败,而导致整个作业失败,因为即使一些任务失败,作业的输出结果也是可用的,我们可用通过运行任务失败的最大比例:m

SavePoint 是 Apache Flink 中用于保存作业状态的机制,其核心目标是在特定时间点捕获流处理作业的状态快照,以便在需要时(如升级、调试或故障恢复)从该状态恢复执行。SavePoint 的实现依赖于 Flink 的检查点(Checkpoint)机制,但与 Checkpoint 不同的是,SavePoint 是用户显式触发的,并且通常用于长期存储和跨版本兼容性。 ### SavePoint 的底层实现逻辑 1. **基于 Checkpoint 机制** SavePoint 的生成过程类似于 Checkpoint,它通过触发一个全局一致性快照来捕获当前作业的所有状态。Flink 使用 Barrier 对齐机制确保所有算子的状态一致[^2]。当 SavePoint 被触发后,Flink 会协调所有任务管理器(TaskManager)将各自的状态写入持久化存储中。 2. **状态快照的格式与结构** SavePoint 将整个作业的状态以文件形式存储,包含元数据文件和实际状态数据。元数据文件描述了每个算子的状态结构,包括状态名称、类型以及对应的键组信息等。这些元数据使得 SavePoint 具备良好的可读性和可移植性,便于后续恢复或迁移[^3]。 3. **支持多种状态后端** SavePoint 可以与不同的状态后端配合使用,例如 MemoryStateBackend、FsStateBackend 和 RocksDBStateBackend。每种状态后端决定了状态数据如何被序列化和存储。例如,RocksDBStateBackend 更适合大规模状态,因为它将状态存储在本地磁上并通过 RocksDB 进行高效管理[^5]。 4. **跨版本兼容性设计** SavePoint 支持在不同版本的 Flink 集群之间进行恢复操作。为了实现这一点,Flink 提供了状态序列化框架(如 POJO 或 Avro),并确保状态的 Schema 演进不会破坏已有 SavePoint 的可读性。这种设计使得 SavePoint 在应用升级或架构调整时仍然可用。 5. **恢复流程** 当从 SavePoint 恢复作业时,Flink 会读取 SavePoint 中的元数据和状态数据,并将其加载到相应的算子中。这一过程由 JobManager 协调完成,确保各个 TaskManager 接收到正确的初始状态。如果作业的拓扑结构发生了变化(例如增加了并行度),Flink 会自动重新分配状态数据[^2]。 6. **手动控制与灵活性** 用户可以通过命令行工具或 REST API 显式地创建和恢复 SavePoint。这种方式为运维提供了极大的灵活性,尤其是在进行 A/B 测试、回滚或灰度发布时非常有用[^3]。 ### 示例:使用 SavePoint 触发和恢复命令 ```bash # 触发 SavePoint bin/flink savepoint <jobId> hdfs://hadoop102:8020/sp/ # 从 SavePoint 恢复作业 bin/flink run-application -d -t yarn-application \ -s hdfs://hadoop102:8020/sp/savepoint-267cc0-47a214b019d5 \ -Dstate.backend=rocksdb \ -c com.atguigu.checkpoint.SavepointDemo \ FlinkTutorial-1.0-SNAPSHOT.jar ``` 上述命令展示了如何触发 SavePoint 并从指定路径恢复作业,同时指定了状态后端为 RocksDB。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值