2015-07-20 35 views
0

我正在運行啓動AWS EMR並在其上運行步驟的Java作業。在向EMR添加一個步驟之後,我會調用listSteps函數來獲取步驟的狀態,並等待它們全部完成/失敗。適用於AWS EMR的Java客戶端,listSteps不顯示最新步驟

我注意到,有時函數listSteps不包括我添加的最後一步,如果我在添加它後立即調用它。這讓我覺得所有的步驟都已經完成,而實際上最後一步還沒有開始。

  1. 這是一個已知的問題或我在這裏丟失什麼?
  2. 在致電listSteps之前,有沒有「最佳實踐」來避免這種情況,除了「睡眠」?

我使用Amazon SDK中的「AmazonElasticMapReduceClient」類。

回答

1

我不認爲這種問題有一個神奇的解決方法。許多AWS調用都是異步的。例如,啓動EC2機器將立即返回,然後您必須輪詢以查看實例是否已啓動。我想通過一些設計,這不會成爲一個問題。我看到以下幾種選擇:

創建羣集並添加作業步驟時,您知道要添加到羣集的作業步數和作業步數,以便可以啓動新線程並監視羣集對於添加(在僞代碼)的所有步驟:

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

然後你在你的狀態檢查做(查看是否工作已經完成)是調用listSteps()並檢查其狀態。這可能是最簡單的解決方案。

另一個設計選項是您有一個工作步驟,通知您的軟件進度或成功完成作業。這個設計選項是異步的,不需要輪詢。例如,創建一個名爲notify的作業步驟。然後你運行像

  1. JobStep1你的腳步
  2. 通知
  3. JobStep2
  4. 通知

每個通知步驟可listSteps()上的作業流程,看看前面的步驟的結果並更新數據庫,向服務發送消息,或者隨着作業進度更新緩存。

相關問題