Oozie中FIFO、LIFO与LASTONLY的区别及作业优先级规则问询
Oozie作业优先级:FIFO、LIFO、LASTONLY逻辑详解
作为常年跟Oozie打交道的老司机,我来给你掰扯清楚这三种优先级设置的逻辑,特别是LIFO和LASTONLY的区别,用时序例子给你讲明白,保证一看就懂。
一、FIFO(先进先出):最朴素的排队逻辑
这就是咱们日常排队的规则——先进先出,完全按作业提交的先后顺序执行,没有任何插队机会。不管后面的作业多紧急,只要你提交得晚,就得等前面的都跑完。
举个简单例子:你按J1→J2→J3的顺序提交作业,执行顺序必然是J1完成→J2完成→J3完成,严格遵循提交时序。
二、LIFO(后进先出):最新提交的先跑(但不丢任务)
LIFO把等待队列变成了一个栈结构,最后提交的作业压在栈顶,会被优先调度。但要划重点:已经在运行的作业不会被打断,只有等待队列里的作业会倒序执行。
时序示例:
- t0时刻:提交J1,J1开始运行
- t1时刻:提交J2,J2进入等待队列
- t2时刻:提交J3,J3进入等待队列(此时等待队列的栈顺序是
[J2, J3],栈顶为J3) - t3时刻:J1运行完成,调度器先取栈顶的J3执行,J3跑完后再执行J2
可以看到,所有等待的作业都会被执行,只是顺序完全反过来了,最新提交的先获得资源。
三、LASTONLY(仅执行最后一个):只留最新的,旧的直接丢
LASTONLY是LIFO的“极端精简版”——等待队列里永远只保留最后提交的那个作业,之前的等待作业会被直接丢弃,连排队的资格都没有。
时序示例:
- t0时刻:提交J1,J1开始运行
- t1时刻:提交J2,J2进入等待队列
- t2时刻:提交J3,调度器直接将J2从等待队列中移除,仅保留J3
- t3时刻:J1运行完成,直接执行J3,J2永远不会被执行
这种逻辑下,不管你提交了多少个等待作业,最后只有最新的那个能得到执行机会。
四、LIFO与LASTONLY的核心差异
这俩经常被混淆,其实核心区别就两点:
- 作业留存与执行:LIFO会保留所有等待作业并倒序执行;LASTONLY只保留最后一个等待作业,其余直接丢弃,根本不会执行
- 适用场景:
- LIFO适合需要处理所有任务,但希望最新任务优先执行的场景(比如批量增量同步,新批次先跑不耽误业务)
- LASTONLY适合只需要最新结果的场景(比如监控告警触发,只要最新的一次告警任务,之前的排队任务毫无意义)
五、三者核心区别总结
给你把三者的定位和逻辑捋得明明白白:
- FIFO:严格按提交顺序执行,无优先级倾斜,适合对执行顺序有要求、无时间敏感性的批量任务(比如按天跑的全量数仓同步)
- LIFO:等待队列倒序执行,所有作业都会被处理,优先最新提交的,适合需要优先处理最新任务但不能丢弃历史任务的场景
- LASTONLY:仅保留并执行最后提交的等待作业,自动淘汰旧任务,适合只需要最新结果、历史等待任务无价值的场景
内容的提问来源于stack exchange,提问作者Kumar




