2017-04-21 49 views
4

是有辦法來設置超時步亞馬遜AWS EMR亞馬遜EMR - 如何設置超時一步

我正在EMR上運行批處理Apache Spark作業,如果該作業不在3小時內結束,我希望作業停止併發生超時。

我無法找到一個方法來設置超時在星火未也不紗線,也不在EMR配置

感謝您的幫助!

+0

據我所知,你不能設置超時。但是,如果運行時間超過3小時,您可以始終創建一個Lambda函數,以殺死您的作業或羣集;-) –

+0

謝謝!這就是我的想法,但我希望找到一種更簡單的方法,只需在創建步驟期間或直接在YARN中設置一些配置參數即可。 – nicola

+0

@GlennieHellesSindholt,這是從lambda函數中殺死一個步驟的最簡單方法? (我只是想殺死這個步驟,但我不想終止整個集羣) – nicola

回答

0

好吧,正如許多人已經回答的那樣,此時EMR步驟不能通過API調用終止/停止/終止。

但是爲了實現您的目標,您可以將超時作爲應用程序代碼本身的一部分引入。當您提交EMR步驟時,會創建一個子進程來運行您的應用程序 - 無論是MapReduce應用程序,Spark應用程序等,並且完成步驟由此子進程(這是您的應用程序)返回的退出代碼確定。

例如,如果你提交的MapReduce的應用程序,你可以使用類似如下:

FileInputFormat.addInputPath(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 

final Runnable stuffToDo = new Thread() { 
    @Override 
    public void run() { 
    job.submit(); 
    } 
}; 

final ExecutorService executor = Executors.newSingleThreadExecutor(); 
final Future future = executor.submit(stuffToDo); 
executor.shutdown(); // This does not cancel the already-scheduled task. 

try { 
    future.get(180, TimeUnit.MINUTES); 
} 
catch (InterruptedException ie) { 
    /* Handle the interruption. Or ignore it. */ 
} 
catch (ExecutionException ee) { 
    /* Handle the error. Or ignore it. */ 
} 
catch (TimeoutException te) { 
    /* Handle the timeout. Or ignore it. */ 
} 
System.exit(job.waitForCompletion(true) ? 0 : 1); 

參考 - Java: set timeout on a certain block of code?

希望這會有所幫助。

+0

其實在我的情況下,我不能在代碼中設置超時,因爲有時問題不在代碼本身。在某些情況下,甚至不能創建應用程序容器,因此該步驟被卡住,不斷重試以創建容器,甚至不會開始運行應用程序代碼。 – nicola