AWS Glue 作业使用来自外部 REST 的数据 API

AWS Glue job consuming data from external REST API

我正在尝试创建一个工作流,其中 AWS Glue ETL 作业将从外部 REST API 而不是 S3 或任何其他 AWS 内部来源中提取 JSON 数据。 这可能吗?有人这样做吗? 请帮忙!

是的,我确实从 REST API 中提取数据,例如 Twitter、FullStory、Elasticsearch 等。通常,我确实使用 Python Shell 作业进行提取,因为它们更快(冷启动相对较小)。完成后,它会触发一个 Spark 类型的作业,该作业只读取我需要的 json 项。 我使用请求 pyhton 库。

为了将数据保存到 S3 中,您可以这样做

import boto3
import json

# Initializes S3 client
s3 = boto3.resource('s3')

tweets = []
//Code that extracts tweets from API
tweets_json = json.dumps(tweets)
obj = s3.Object("my-tweets", "tweets.json")
obj.put(Body=data)

AWS Glue Python Shell 执行器的限制为最大 1 个 DPU。 如果这是一个问题,就像我的情况一样,解决方案可能是 运行将 ECS 中的脚本作为任务。

您可以 运行 大约 150 requests/second 使用 python 中的 asyncio 和 aiohttp 等库。 example 1, example 2.

然后您可以使用 Ray 将您的请求分发到多个 ECS 任务或 Kubernetes pods。 Here 您可以找到一些 Ray 可以为您做些什么的例子。

这还允许您满足具有速率限制的 API。

收集完所需的所有数据后,运行 通过 AWS Glue。

是的,这是可能的。您可以使用 Amazon Glue 从 REST API 中提取数据。尽管 Glue 没有可用于连接到互联网世界的直接连接器,但您可以设置一个 VPC,具有 public 和一个私有子网。在私有子网中,您可以创建一个 ENI,它只允许 GLue 的出站连接从 API 获取数据。在 public 子网中,您可以安装 NAT 网关。

此外,您可能还需要设置一个安全组来限制入站连接。希望这能回答您的问题。