2011-02-24 2 views
2

J'essaie d'exécuter une tâche mapreduce sur amazon ec2. Je définis tous les paramètres de configuration, puis appelle la méthode runFlowJob du service AmazonElasticMapReduce. Je me demande s'il existe un moyen de savoir si le travail est terminé et quel était le statut. (j'ai besoin de savoir quand je peux ramasser les résultats de mapreduce à partir de s3 pour un traitement ultérieur)Comment puis-je savoir quand la tâche amazon mapreduce est terminée?

actuellement le code continue à s'exécuter car l'appel de runJobFlow est non-bloquant.

public void startMapReduceTask(String accessKey, String secretKey 
     ,String eC2KeyPairName, String endPointURL, String jobName 
     ,int numInstances, String instanceType, String placement 
     ,String logDirName, String bucketName, String pigScriptName) { 
    log.info("Start running MapReduce"); 

    // config.set 
    ClientConfiguration config = new ClientConfiguration(); 
    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); 

    AmazonElasticMapReduce service = new AmazonElasticMapReduceClient(credentials, config); 
    service.setEndpoint(endPointURL); 

    JobFlowInstancesConfig conf = new JobFlowInstancesConfig(); 

    conf.setEc2KeyName(eC2KeyPairName); 
    conf.setInstanceCount(numInstances); 
    conf.setKeepJobFlowAliveWhenNoSteps(true); 
    conf.setMasterInstanceType(instanceType); 
    conf.setPlacement(new PlacementType(placement)); 
    conf.setSlaveInstanceType(instanceType); 

    StepFactory stepFactory = new StepFactory(); 

    StepConfig enableDebugging = new StepConfig() 
    .withName("Enable Debugging") 
    .withActionOnFailure("TERMINATE_JOB_FLOW") 
    .withHadoopJarStep(stepFactory.newEnableDebuggingStep()); 

    StepConfig installPig = new StepConfig() 
    .withName("Install Pig") 
    .withActionOnFailure("TERMINATE_JOB_FLOW") 
    .withHadoopJarStep(stepFactory.newInstallPigStep()); 

    StepConfig runPigScript = new StepConfig() 
    .withName("Run Pig Script") 
    .withActionOnFailure("TERMINATE_JOB_FLOW") 
    .withHadoopJarStep(stepFactory.newRunPigScriptStep("s3://" + bucketName + "/" + pigScriptName, "")); 

    RunJobFlowRequest request = new RunJobFlowRequest(jobName, conf) 
    .withSteps(enableDebugging, installPig, runPigScript) 
    .withLogUri("s3n://" + bucketName + "/" + logDirName); 

    try { 
     RunJobFlowResult res = service.runJobFlow(request); 
     log.info("Mapreduce job with id[" + res.getJobFlowId() + "] completed successfully"); 
    } catch (Exception e) { 
     log.error("Caught Exception: ", e); 
    } 
    log.info("End running MapReduce");  
} 

grâce,

Aviad

Répondre

2

De la documentation AWS:

Une fois que le flux de travail est terminé, le cluster est arrêté et la partition HDFS est perdu. Pour éviter la perte de données, configurez la dernière étape du flux de travaux pour stocker les résultats dans Amazon S3.

Il poursuit en disant:

Si le paramètre est réglé sur JobFlowInstancesDetail : KeepJobFlowAliveWhenNoStepsTRUE, le flux de travail va passer à l'état WAITING plutôt que d'arrêter une fois que les étapes terminées.

Un maximum de 256 étapes est autorisé dans chaque flux de travaux.

Pour des flux de travaux longs, nous vous recommandons de stocker périodiquement vos résultats.

Il semble donc qu'il n'y a aucun moyen de savoir quand cela est fait. Au lieu de cela, vous devez enregistrer vos données dans le cadre du travail.

Questions connexes