运行Oozie时HDFS中JSON文件出现FileNotFoundError问题求助
问题排查与解决方案:Oozie Spark Action 无法找到HDFS上的JSON参数文件
可能的原因及对应解决步骤
1. HDFS路径权限不匹配
- 检查运行Oozie作业的用户(通常是
oozie用户或提交作业的用户)是否拥有该JSON文件的读权限,以及文件所在目录的执行权限。 - 执行HDFS权限检查命令:
hdfs dfs -ls /path/to/your/config.json hdfs dfs -getfacl /path/to/your/config.json - 若权限不足,调整权限:
hdfs dfs -chmod 644 /path/to/your/config.json hdfs dfs -chown oozie:oozie /path/to/your/config.json
2. workflow.xml中路径配置格式错误
- 确保配置的HDFS路径是完整绝对路径,需以
hdfs://开头(或匹配集群HDFS URI格式,如hdfs://nameservice1/...),禁止使用相对路径。 - 错误示例:
config_file=config.json - 正确示例:
config_file=hdfs:///user/yourname/config.json
3. Spark脚本读取文件的方式错误
- 若脚本用本地文件系统方式读取(如
open("config.json")),YARN容器会在本地路径查找,导致找不到HDFS上的文件。 - 两种修正方式:
- 方式1:用Spark HDFS API读取并解析:
from pyspark import SparkContext import json sc = SparkContext.getOrCreate() json_content = sc.textFile("${config_file}").collect()[0] params = json.loads(json_content) - 方式2:在Spark Action中添加
<file>标签,让Oozie自动将HDFS文件分发到容器本地:
此时脚本可直接读取本地的<spark xmlns="uri:oozie:spark-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <prepare> <delete path="${output}"/> </prepare> <master>${master}</master> <name>Spark Job</name> <class>com.your.package.YourClass</class> <jar>hdfs:///path/to/your/spark.jar</jar> <file>${config_file}#config.json</file> <!-- 分发到本地并命名为config.json --> <arg>${config_file}</arg> </spark>config.json。
- 方式1:用Spark HDFS API读取并解析:
4. Coordinator参数传递缺失或错误
- 确认
coordinator.xml中是否正确将参数传递给Workflow:<action> <workflow> <app-path>${workflowAppPath}</app-path> <configuration> <property> <name>config_file</name> <value>${config_file}</value> </property> </configuration> </workflow> </action> - 检查Coordinator启动时是否传入了正确的参数值,避免参数被覆盖或未传递。
5. HDFS路径大小写不匹配
- HDFS区分大小写,确认配置路径与实际文件路径的大小写完全一致(如
Config.json和config.json会被视为不同文件)。
内容的提问来源于stack exchange,提问作者Roopanjali Jasrotia
相关产品推荐
相关产品推荐

