Java AWS EMR 客户端,listSteps 不显示最新步骤

Java Client for AWS EMR, listSteps doesn't show the latest step

我正在 运行 启动 AWS EMR 和 运行 步骤的 Java 作业。在我向 EMR 添加一个步骤后,我调用 listSteps 函数来获取步骤的状态并等待它们全部 done/failed.

我注意到,如果我在添加后立即调用函数 listSteps,有时它不会包含我添加的最后一步。这让我认为所有步骤都已完成,而实际上最新的步骤甚至还没有开始。

  1. 这是已知问题还是我遗漏了什么?
  2. 在调用 listSteps 之前是否有 "best practice" 来避免这种情况,除了 "sleeping"?

我正在使用 Amazon SDK 中的 "AmazonElasticMapReduceClient" class。

我认为没有解决此类问题的神奇方法。许多 AWS 调用是异步的。例如,启动 EC2 机器将立即 return,然后您必须轮询以查看该实例是否已启动。我认为通过一些设计,这不会是什么大问题。我看到几个选项:

当您创建集群并添加作业步骤时,您知道有多少作业步骤,以及要将哪些作业步骤添加到集群中,因此您可以启动一个新线程并监控集群中正在执行的所有步骤添加(在伪代码中):

function createCluster(steps, callback):
    aws.runJobFlow(...)
    on new thread:
        while(steps != aws.listSteps(...)):
            sleep()
        callback()

然后,您在状态检查(查看作业是否已完成)中所要做的就是调用 listSteps() 并检查状态。这可能是解决问题的最简单方法。

另一个设计选项是您有一个作业步骤,可以通知您的软件作业的进度或成功完成。此设计选项将是异步的,不需要轮询。例如,创建一个名为 notify 的作业步骤。然后你 运行 你的脚步像

  1. JobStep1
  2. 通知
  3. JobStep2
  4. 通知

每个通知步骤都可以在作业流上使用 listSteps() 来查看前面步骤的结果并更新数据库、向服务发送消息或使用作业进度更新缓存。