9
votes

(Hadoop) Mapreduce - Jobs à chaîne - JobControl ne s'arrête pas

J'ai besoin de la chaîne de deux emplois Mapreduce. J'ai utilisé Jobcontrol pour définir Job2 aussi dépendant de Job1. Cela fonctionne, les fichiers de sortie sont créés !! Mais ça ne s'arrête pas! Dans la coquille, il reste dans cet état: xxx

Comment puis-je l'arrêter? Ceci est ma principale. xxx

} }


8 commentaires

J'ai résolu l'utilisation d'un fil pour démarrer JobControl. J'ai vérifié que les travaux ont été effectués en utilisant un cycle tandis que: tandis que (! Jobctrl.Allfinished ()) et un système.exit () sur le cycle. Maintenant, je voudrais que les travaux renvoient des messages d'information, tout ce que j'ai obtenu est de savoir quel travail est en cours d'exécution, avec ControldedJob.tostring (). Je ne sais pas comment obtenir des messages d'information comme: numéro de tâche de mapper, numéro de tâche de réduction, enregistrements en entrée ou en sortie, etc. ... une idée de ces messages?


Est "job.getcounters (). Tostring ()" Assez?


Est-ce un bogue dans la classe JobControl?


Ceci est en fait vraiment utile pour voir un exemple de travail de la chaîne de la chaîne de MR. Impossible de trouver une explication claire à ce sujet!


@Pietroluciani aussi, pour le moins expérimenté, voir le code que vous avez utilisé pour arrêter votre travail serait vraiment utile.


Bonjour, j'ai écrit du code il y a deux ans, ce soir ou demain je vais essayer de rechercher du code.


Bonjour, @Austin A, je modifie mon message avec le code demandé par vous.


Merci @pietroluciani, je n'ai pas fait beaucoup de choses avec un filetage, c'est vraiment utile pour moi!


4 Réponses :


6
votes

J'ai essentiellement fait ce que Pietro faisait allusion au-dessus. XXX PRE>

et dans ma carte de map / réduise, j'ai: P>

public void handleRun(JobControl control) throws InterruptedException {
    JobRunner runner = new JobRunner(control);
    Thread t = new Thread(runner);
    t.start();

    while (!control.allFinished()) {
        System.out.println("Still running...");
        Thread.sleep(5000);
    }
}


0 commentaires

3
votes

L'objet Jobcontrol lui-même est exécutable, vous pouvez donc simplement l'utiliser comme ceci:

new Thread(myJobControlInstance).start()


0 commentaires

0
votes

Juste un tweak à l'extrait de code Qu'est-ce que SINEMETU1 avait partagé ..

Vous pouvez supprimer l'appel au JobRunner comme JobControl en soi-même implémente Runnable P>

        Thread thread = new Thread(jobControl);
        thread.start();

        while (!jobControl.allFinished()) {
            System.out.println("Still running...");
            Thread.sleep(5000);
        }


0 commentaires

0
votes

Essayez ceci:

    Thread jcThread = new Thread(jobControl);
    jcThread.start();
    System.out.println("循环判断jobControl运行状态 >>>>>>>>>>>>>>>>");
    while (true) {
        if (jobControl.allFinished()) {
        System.out.println("====>> jobControl.allFinished=" + jobControl.getSuccessfulJobList());
        jobControl.stop();
        // 如果不加 break 或者 return,程序会一直循环
        break;
    }

    if (jobControl.getFailedJobList().size() > 0) {
        succ = 0;
        System.out.println("====>> jobControl.getFailedJobList=" + jobControl.getFailedJobList());
        jobControl.stop();

        // 如果不加 break 或者 return,程序会一直循环
        break;
    }
}


0 commentaires