我们有一个 Spark Streaming 作业,每 30 分钟运行一次,需要 15 秒才能完成。在这种情况下建议的最佳做法是什么。我想我可以安排 AWS 数据管道每 30 分钟运行一次,以便 EMR 在 15 秒后终止并重新创建。这是推荐的方法吗?
2 回答
对于需要15 seconds
在 EMR 上运行的作业是浪费时间和资源,您可能会等待几分钟让 EMR 集群启动。
AWS Data Pipeline 或 AWS Batch 仅在您有长时间运行的作业时才有意义。
首先,确保您确实需要 Spark,因为根据您的描述,这可能是一种矫枉过正。
具有 CloudWatch 事件调度的 Lambda 可能是您在无需管理基础设施的情况下完成如此快速的工作所需要的全部。
对于流相关的工作 - >关键是在你的情况下避免 IO - 因为工作似乎只需要 15 秒。将您的消息推送到队列 (AWS SQS)。有一个由 Cloudwatch 事件触发的 AWS step 函数(在您的案例中每 30 分钟实施一次计划,如 Cron - 调用 AWS Step 函数)以从 SQS 读取消息并理想地在 lambda 中处理它们。
所以一个选项(无服务器):
流式消息 --> AWS SQS ->(每 30 分钟 cloudwatch 触发一个 step 函数)-> 触发 lambda 服务来处理队列中的所有消息
选项 2:
流式消息---> AWS SQS -> 使用 Python 应用程序/Java Spring 应用程序处理消息,该应用程序有一个计划任务,每 30 分钟唤醒一次,从队列中读取消息并在内存中处理它。
我已经使用选项 2 来解决分析问题,虽然我的分析问题需要 10 分钟并且是数据密集型的。此外,选项 2 需要监视运行进程的虚拟机(容器)。另一方面,选项 1 是无服务器的。最后,这一切都归结为您已经拥有的软件堆栈以及处理流数据所需的软件。