EMR集群提交Oozie作业报crunch临时文件FileNotFoundException如何解决
从报错堆栈可以明确,作业失败是因为YARN在为Map任务准备容器启动上下文时,从分布式缓存加载路径为hdfs://ip-10-23-31-119.us-west-2.compute.internal:8020/tmp/crunch-1324412807/p2/MAP的文件失败,该文件属于Apache Crunch框架生成的临时输出文件。此时作业还未进入业务代码执行阶段,所以看不到应用代码的自定义日志属于正常情况。
排查方向
1. 临时文件生命周期异常
- Crunch自动清理逻辑触发:Crunch框架默认会在作业运行结束(无论成功/失败)后自动删除
/tmp下生成的临时目录,如果你的Oozie工作流存在「下游任务依赖上游Crunch作业生成的临时文件」的逻辑,大概率是上游作业跑完后自动清理了临时文件,下游任务启动时已经找不到文件。 - HDFS /tmp目录自动清理:EMR默认会启动
hdfs-cleaner服务定期删除/tmp下超过存储阈值(默认7天,部分自定义集群会调整到数小时)的文件,确认上游作业生成文件和下游作业启动的时间间隔是否超过了清理阈值。 - 作业重试导致文件覆盖:如果上游Crunch作业配置了失败自动重试,重试时会先删除旧的crunch临时目录,关联旧目录的下游任务就会找不到对应文件。
2. 权限与路径配置错误
- 执行用户权限不匹配:Oozie作业默认用
oozie用户提交,若上游生成临时文件的作业是用hadoop或其他用户运行,且临时文件权限配置为仅所有者可读,部分旧版Hadoop会将无权限访问的文件统一报FileNotFoundException而非权限错误。你可以分别用Oozie执行用户和上游作业提交用户执行命令hdfs dfs -ls hdfs://ip-10-23-31-119.us-west-2.compute.internal:8020/tmp/crunch-1324412807/p2/MAP,验证是否可以正常访问。 - 路径配置不一致:检查作业代码中Crunch临时目录的配置,确认上游写文件和下游读文件使用的是同一个NameNode地址,避免出现跨集群、跨实例的路径错误。
3. Oozie工作流配置问题
- 依赖关系缺失:确认Oozie工作流中是否正确配置了上下游作业的依赖规则,是否存在下游作业在上游作业未完全写完临时文件就提前启动的情况。
- 分布式缓存配置错误:从报错堆栈看文件是在加载分布式缓存阶段找不到的,确认作业是否手动将Crunch临时文件加入了分布式缓存,路径是否填写正确。
解决方案
- 临时验证:在作业配置中添加参数
crunch.tmp.dir.preserve=true关闭Crunch临时目录自动清理,重跑作业确认是否还会报错。 - 永久修复:不要使用HDFS
/tmp下的Crunch临时文件作为上下游作业的数据传递介质,将上游作业的输出写入自定义的非临时目录,完成后再供下游任务读取。 - 权限适配:如果验证是权限问题,要么给临时目录开放对应可读权限,要么统一Oozie工作流所有作业的执行用户。
- 调整清理策略:如果确实需要使用
/tmp下的临时文件,调整EMRhdfs-cleaner服务的清理阈值,匹配作业运行的时间间隔。
内容的提问来源于stack exchange,提问作者Dravidian
相关产品推荐
相关产品推荐

