2014-11-04 4 views
4

Я пишу сценарий bash, который запускает команду aws emr (aws emr версия 1.5.2).Amazon EMR --wait-for-steps

Как сообщить моему сценарию, что до окончания работы emr заканчивается работа? Опция --wait-for-steps обесценивается сейчас.

через jq я получил, но это только кажется неправильным подходом:

STEP_STATUS_STATE=$(aws emr list-steps --cluster-id ${CLUSTER_ID} | jq '.Steps[0].Status.State' | tr -d '"') 
while [[ ${STEP_STATUS_STATE} == PENDING ]] || [[ ${STEP_STATUS_STATE} == RUNNING ]]; do 
    STEP_STATUS_STATE=$(aws emr list-steps --cluster-id ${CLUSTER_ID} | jq '.Steps[0].Status.State' | tr -d '"') 
    echo $(date) ${STEP_STATUS_STATE} 
    sleep 10 
done 

ответ

1

Я использую AWS Java API, чтобы ждать, пока работа закончена, как показано ниже. Надеюсь, что это помогает

public static final List<JobFlowExecutionState> DONE_STATES = Arrays 
     .asList(new JobFlowExecutionState[] { 
       JobFlowExecutionState.COMPLETED, 
       JobFlowExecutionState.FAILED, 
       JobFlowExecutionState.TERMINATED }); 

...

public static boolean isDone(String value) { 
    JobFlowExecutionState state = JobFlowExecutionState.fromValue(value); 
    return Constants.DONE_STATES.contains(state); 
} 

    . 
    . 
    STATUS_LOOP: while (true) { 
     DescribeJobFlowsRequest desc = new DescribeJobFlowsRequest(
       Arrays.asList(new String[] { result.getJobFlowId() })); 
     DescribeJobFlowsResult descResult = emr.describeJobFlows(desc); 
     for (JobFlowDetail detail : descResult.getJobFlows()) { 
      String state = detail.getExecutionStatusDetail().getState(); 
      if (isDone(state)) { 
       logger.info("Job " + state + ": " + detail.toString()); 

       if(loadToDailyDB && state.equalsIgnoreCase("COMPLETED")) 
       { 

        //Do something 
       } 
       if(!state.equalsIgnoreCase("COMPLETED")) 
       { 

       } 

       break STATUS_LOOP; 
      } else if (!lastState.equals(state)) { 
       lastState = state; 
       logger.info("Job " + state + " at " 
         + new Date().toString()); 
      } 
     } 
     Thread.sleep(75000); 
+1

Интересно - но я надеюсь, что я мог бы сделать это с помощью простого аргумента командной строки, как в предыдущей версии АМС позволило ... – dranxo