AWS EMR集群启动正常但Spark任务提交失败:userData.json无法读取
解决AWS EMR集群Livy提交Spark任务失败:无法读取userData.json的问题
从你贴的报错栈来看,核心卡点是Livy触发Spark任务时,EMR内置的Hadoop文件系统组件读不到/var/aws/emr/userData.json——这个文件是EMR启动时自动生成的内部元数据文件,用来存储集群IAM凭证、配置参数等关键信息,一旦它出问题(缺失、权限不对),Spark任务就没法正常访问S3这类AWS资源,自然提交失败。
下面给你一步步排查和解决的思路:
1. 先确认文件本身的状态
登录集群主节点(或者有问题的任务节点),先看看这个文件在不在、权限对不对:
ls -l /var/aws/emr/userData.json
- 如果文件不存在:说明EMR初始化过程中出了异常,没生成这个文件。先试试重启EMR的Hadoop文件系统服务:
重启后再检查文件是否出现,如果还是没有,大概率得重建集群——毕竟这是EMR内部生成的核心文件,手动创建很容易留坑。sudo systemctl restart emr-hadoop-fs - 如果文件存在:重点看权限,正常情况是
root拥有,权限至少是644(其他用户能读)。要是权限不对,调整一下:sudo chmod 644 /var/aws/emr/userData.json
2. 验证Livy用户的读取权限
Livy默认是以livy用户运行的,得确保这个用户能读这个文件:
sudo -u livy cat /var/aws/emr/userData.json
如果执行报错,说明livy没权限,先把目录权限放开:
sudo chmod 755 /var/aws/emr
3. 检查集群IAM角色配置
userData.json里存着集群的STS凭证信息,如果集群的服务角色(EMR_DefaultRole)或实例配置文件(EMR_EC2_DefaultRole)权限不足,也可能导致文件生成异常或者读不出内容:
- 确认EMR服务角色有
AmazonEMRFullAccess或者足够的权限来生成和访问内部元数据 - 确认实例配置文件有
AmazonS3ReadOnlyAccess以及EMR相关的权限,保证能正常获取STS凭证
4. 排查任务节点的文件同步情况
你的集群有7台任务节点,可能部分节点上的userData.json没同步好。登录几个任务节点重复第一步的检查,确认每个节点都有这个文件且权限正确。如果是同步问题,可以从主节点手动复制:
# 主节点执行,替换成你的任务节点IP scp /var/aws/emr/userData.json hadoop@<任务节点IP>:/var/aws/emr/ # 然后在任务节点上调整权限 sudo chmod 644 /var/aws/emr/userData.json
5. 用最简任务验证集群状态
先排除任务本身的问题,提交一个最简单的Spark任务测试:
curl -X POST --data '{"file": "/usr/lib/spark/examples/src/main/python/pi.py", "args": ["10"]}' http://<你的EMR主节点IP>:8998/batches
如果这个任务能成功运行,那问题可能出在你原本提交的任务的资源路径上;如果还是失败,那肯定是集群内部的元数据或权限问题,回到前面的步骤再排查。
内容的提问来源于stack exchange,提问作者Normal
相关产品推荐
相关产品推荐

