如何解决从 Amazon SageMaker Studio 笔记本电脑连接到 Amazon EMR 集群时出现的 ConnectTimeoutError(连接超时错误)错误?

上次更新日期:2022 年 11 月 14 日

我想解决我在尝试从 Amazon SageMaker Studio 笔记本电脑连接到 Amazon EMR 集群时收到的连接超时错误。

解决方法

连接超时错误可能是由网络配置问题引起的,而这些网络配置问题与 SageMaker Studio 或 Amazon EMR 集群的以下配置有关:

  • Amazon Virtual Private Cloud (Amazon VPC)
  • 子网
  • 安全组

确保满足以下连接先决条件:

  • SageMaker Studio 在仅限 VPC 模式下启动。
  • Amazon EMR 集群和 SageMaker Studio 笔记本电脑在同一 VPC 中启动。如果它们位于不同的 VPC 中,则通过 VPC 对等连接进行连接。如果 VPC 对等连接用于跨区域使用案例,则必须手动配置 /etc/sparkmagic/config.json 配置文件。这是因为 Amazon EMR 集群的发现功能目前不支持跨区域连接。有关更多信息,请参阅在 Amazon EMR 中构建由 Spark 提供支持的 Amazon SageMaker 笔记本电脑
  • Amazon EMR 集群启动时安装了 Apache Spark 和 Apache Livy 应用程序。

要解决连接超时错误,请执行以下操作:

1.    执行以下检查:

  • 确保安全组或网络访问控制列表(ACL)配置正确,允许流量通过 8998 端口。对 SageMaker Studio 笔记本电脑和 Amazon EMR 集群执行此检查。
  • 确保 SageMaker Studio 的安全组有入站规则,允许在域和 Amazon Elastic File System (Amazon EFS) 卷之间通过 2049 端口传输 NFS 流量。
  • 确保 EMR 集群的主节点安全组有通过 8998 端口的自定义 TCP 入站规则。此规则可以指定 Studio 的安全组,也可以指定包含 Studio 子网的 CIDR。
    注意:如果您使用的是 VPC 对等连接,请参阅更新您的安全组以引用对等安全组。本文档提供了有关如何从跨账户 VPC 中指定安全组的信息。如果 Amazon EMR 和 Studio 子网之间有 VPC 对等连接,则相应的路由表必须相互路由流量。如果它们没有正确路由流量,那么您会收到 ConnectTimeoutError(连接超时错误)错误。

2.    如果您在没有 NAT 网关的情况下以仅限 VPC 模式设置私有子网,请分别为 EMR 和 AWS Security Token Service (AWS STS) 创建以下 AWS PrivateLink 接口端点:

  • com.amazonaws. .elasticmapreduce
  • com.amazonaws. .sts

这些端点必须在用于 EMR 集群和 SageMaker Studio 的 VPC 下创建。

AWS STS 是一项全球服务。因此,当您尝试从 us-east-1 以外区域的 Studio 连接到跨账户 Amazon EMR 集群时,您可能会收到 ConnectTimeoutError(连接超时错误)错误:

ConnectTimeoutError: Connect timeout on endpoint URL: "https://sts.amazonaws.com/"

要解决此错误,请在运行 connect 命令之前,在 Jupyter notebook 中将环境变量 AWS_STS_REGIONAL_ENDPOINTS 设置为 regional

%env AWS_STS_REGIONAL_ENDPOINTS=regional
%load_ext sagemaker_studio_analytics_extension.magics
%sm_analytics emr connect --cluster-id example-cluster-id --auth-type None  --assumable-role-arn arn:aws:iam::example-cross-account:role/example-role-name

有关区域端点的更多信息,请参阅管理 AWS 区域中的 AWS STSAWS STS 区域化端点

3.    要检查连接是否正常,请打开您的 Studio 笔记本电脑,选择 Sparkmagic 内核,然后在单元格中运行以下命令:

对于同一账户内的连接:

%local
!sm-sparkmagic connect --cluster-id <cluster-id>

对于跨账户连接:

%local

# If needed, use STS Regional endpoint
%env AWS_STS_REGIONAL_ENDPOINTS=regional 

!sm-sparkmagic connect --cluster-id <cluster-id> --role-arn arn:aws:iam::<cross-account>:role/<role-name>

-或者-

从 EMR 主节点私有 IP 上的笔记本电脑终端运行以下命令:

curl <EMR-Master-Private-IP>:8998/sessions -v

执行以下检查以确保配置准确无误:

通过 SSH 进入 EMR 集群,以获取 Livy 服务的 PID:

ps -ef | grep livy

检查 Livy 服务运行的端口:

sudo netstat -anp | grep <PID>

确保该服务在 Livy 的默认端口 (8998) 上运行。