EMR集群处于WAITING状态时SSH连接被拒绝问题咨询
先理清楚你遇到的情况:
你先执行了
aws emr list-clusters,看到集群状态是WAITING,原因是"Cluster ready after last step failed.";接着用aws emr ssh命令尝试连接,结果报错ssh: connect to host ec2-xxxxxxxx.compute-1.amazonaws.com port 22: Connection refused。
下面是一步步的排查和解决思路,我平时处理这类问题都是这么来的:
1. 先检查网络能不能通
安全组是重点
登录AWS控制台,找到你的EMR集群详情页,定位到主节点对应的EC2实例,查看它关联的安全组。一定要确保安全组的入站规则里,允许你当前的本地IP访问22端口——如果拿不准,临时加个0.0.0.0/0测试(测试完记得改回去,别留安全隐患)。
子网和路由表也不能忽略
如果集群在私有子网,得确认路由表有没有配置NAT网关,不然主节点连不上公网,你也没法从外面SSH进去;要是在公有子网,检查下主节点有没有分配公有IP(EMR默认会给主节点配,但如果你自定义了配置可能会关掉)。
2. 验证密钥对是不是没问题
- 首先,你用的
key-pair.pem必须是创建这个EMR集群时指定的那个密钥对,别拿错了! - 然后给密钥文件设置正确的权限,权限太松SSH会直接拒绝:
chmod 400 ~/.ssh/keys/key-pair.pem - 可以跳过EMR的
ssh命令,直接用EC2实例的IP连接试试,排除命令参数的问题:
注意哦,EMR主节点的默认用户名是ssh -i ~/.ssh/keys/key-pair.pem hadoop@ec2-xxxxxxxx.compute-1.amazonaws.com -o StrictHostKeyChecking=nohadoop,别用成root或者其他的。
3. 看看主节点本身有没有问题
虽然集群状态显示WAITING,但主节点的SSH服务可能没起来。
- 去EMR集群的“日志”页面,翻主节点的系统日志,比如
/var/log/secure或者/var/log/messages,看看有没有SSH启动失败的记录。 - 要是你集群配置了SSM权限,直接用Session Manager连主节点更方便:在EC2控制台找到主节点实例,点“连接”选“Session Manager”,进去后查SSH服务状态:
要是没启动,就重启试试:sudo systemctl status sshdsudo systemctl restart sshd
4. 检查集群的SSH配置有没有被改
用aws emr describe-cluster --cluster-id j-MQIKB378OARL看看集群的配置细节,有没有人禁用了SSH访问,或者改了SSH端口。另外,如果集群开了Kerberos认证,普通SSH连接会失败,得先拿Kerberos票据才行。
5. 最后一招:重启主节点(谨慎操作!)
如果前面都排查完了还是不行,而且集群现在没有运行中的任务,可以试试重启主节点的EC2实例:在EC2控制台找到实例,选“实例状态”->“重启实例”,等它起来后再试SSH连接。
内容的提问来源于stack exchange,提问作者Jas

