Oozie工作流本地Jar更新后YARN报Resource changed的解决问询
解决YARN因本地Jar时间戳不一致拒绝使用新版本的问题
针对你遇到的YARN校验本地Jar时间戳失败的问题,结合你的需求(保留本地Jar、用符号链接切换版本、不同步节点时间戳),下面是几个可行的解决方案:
方案1:关闭YARN的本地资源时间戳校验(最直接)
YARN默认会校验提交作业时记录的本地资源时间戳和节点上实际文件的时间戳是否一致,这是为了防止资源被篡改或不一致。你可以通过修改全局配置跳过这个校验:
- 编辑YARN的配置文件
yarn-site.xml,添加或修改以下参数:<property> <name>yarn.nodemanager.localizer.resource.check-timestamp</name> <value>false</value> </property> - 重启所有NodeManager服务,让配置生效。
这个方法的优势是一劳永逸,不需要修改Oozie工作流或同步节点时间戳,完全满足你用符号链接切换版本的需求。需要注意的是,关闭时间戳校验会降低YARN对资源完整性的校验能力,适合内部可控的集群环境。
方案2:让Oozie重新获取Jar的元数据(配合符号链接)
如果你不想修改全局YARN配置,可以通过让Oozie重新读取Jar的时间戳来适配新版本:
- 先确保所有节点上的符号链接都指向了新版本Jar(比如执行
ln -sf /opt/tst/tst-v2.jar /opt/tst/tst.jar)。 - 停止当前失败的Oozie工作流实例,清理相关的YARN缓存(可以手动删除
yarn.nodemanager.local-dirs下对应作业的缓存目录,或者直接重启NodeManager)。 - 重新提交Oozie工作流:此时Oozie会重新解析符号链接指向的Jar文件,获取最新的时间戳并提交给YARN。不过这个方法的前提是所有节点上的Jar时间戳必须一致,如果你的节点时间戳无法同步,这个方案就不适用,还是方案1更合适。
方案3:给Jar路径添加版本标识(临时应急)
如果需要快速测试新版本,又不想修改配置或同步时间,可以在Oozie工作流的Java动作中,给Jar路径添加一个版本参数(类似缓存击穿的技巧):
<java> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <main-class>com.your.package.MainClass</main-class> <java-opts>-Xmx1024m</java-opts> <archive>file:///opt/tst/tst.jar?version=2</archive> </java>
这样Oozie会认为这是一个新的资源,重新读取时间戳并提交。不过这个方法需要修改Oozie工作流定义,不符合你“无需更新Oozie即可切换版本”的需求,适合临时场景使用。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

