Question

J'essaie d'exécuter l'exemple des chemins les plus courts de l'incubateur giraphe ( https://cwiki.apache.org/confluence/display/giraphe/shortest+Paths+Example ). Cependant, au lieu d'exécuter l'exemple du giraph-* - dépendances.jar, j'ai créé mon propre Jar. Lorsque j'ai créé un seul fichier de travail tel que présenté dans l'exemple, je devais avoir

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.Test$SimpleShortestPathsVertexInputFormat

Puis j'ai déplacé les classes intérieures (SimplesHORESTESTPATHSTEVERTEXIPORTPATORATTEXTEXTEXTEXOUTOPORT) pour séparer les fichiers et les renommé juste au cas où (SimpleShorTestPathstTertexInporFormat_v2, SimpleShortesTPathsverteXOutFormat_v2); Les classes ne sont pas statiques plus. Cela a résolu les problèmes de la classe non trouvée pour le SimpleShorTestPathsverTexInputformat_v2, mais je reçois toujours la même erreur pour le SimpleShorTestPathsvertExOutPormat_v2. Ci-dessous est ma trace de pile.

INFO mapred.JobClient: Running job: job_201205221101_0003
INFO mapred.JobClient:  map 0% reduce 0%
INFO mapred.JobClient: Task Id : attempt_201205221101_0003_m_000005_0, Status : FAILED
    java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2
            at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:898)
            at org.apache.giraph.graph.BspUtils.getVertexOutputFormatClass(BspUtils.java:134)
            at org.apache.giraph.bsp.BspOutputFormat.getOutputCommitter(BspOutputFormat.java:56)
            at org.apache.hadoop.mapred.Task.initialize(Task.java:490)
            at org.apache.hadoop.mapred.MapTask.run(MapTask.java:352)
            at org.apache.hadoop.mapred.Child$4.run(Child.java:259)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.security.auth.Subject.doAs(Subject.java:415)
            at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
            at org.apache.hadoop.mapred.Child.main(Child.java:253)
    Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.test.giraph.utils.SimpleShortestPathsVertexOutputFormat_v2
            at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866)
            at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:890)
            ... 9 more

J'ai inspecté mon jar de travail et toutes les classes sont là. En outre, j'utilise Hadoop 0.20.203 dans un mode pseudo distribué. La façon dont je lance mon travail est présentée ci-dessous.

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar /path/to/input /path/to/output 0 3

Aussi j'ai défini hadoop_classpath pour le giraph-* - dépendances.jar. Je peux exécuter l'exemple PagerankbenchMark sans problème (directement à partir du giraph-* - dépendances.jar), et l'exemple de chemin du short fonctionne également (également directement à partir des dépendances giraph-* --.jar). D'autres emplois Hadoop fonctionnent sans problème (quelque part, j'ai lu pour tester si mon "cluster" fonctionne correctement). Est-ce que quelqu'un a rencontré un problème similaire? Toute aide sera appréciée.


solution (désolé de la poster comme ça, mais je ne peux pas répondre à ma propre question pour quelques heures supplémentaires)

Pour résoudre ce problème, j'ai dû ajouter mon jarre à la partie -Libjars (aucune modification de hadoop_classpath où fait). La commande de lancement d'emploi ressemble maintenant à ceci.

hadoop jar giraphJobs.jar org.test.giraph.Test -libjars /path/to/giraph-0.2-SNAPSHOT-jar-with-dependencies.jar,/path/to/job.jar /path/to/input /path/to/output 0 3

La liste des pots doit être séparée par des virgules. Bien que cela a résolu mon problème. Je suis toujours curieux pourquoi je dois transmettre mon jar de travail en tant que paramètre "ClassePath"? Quelqu'un peut-il m'expliquer quel est le rationnel derrière cela? Comme je l'ai trouvé étrange (à dire le moins) d'invoquer mon jar de travail puis de le transmettre à nouveau comme un pot "de classe". Je suis vraiment curieux de l'explication.

Était-ce utile?

La solution

J'ai trouvé une solution de programmation alternative au problème. Nous devons modifier la méthode exécutive () de la manière suivante -

...
@Override
public int run(String[] argArray) throws Exception {
    Preconditions.checkArgument(argArray.length == 4,
        "run: Must have 4 arguments <input path> <output path> " +
        "<source vertex id> <# of workers>");

    GiraphJob job = new GiraphJob(getConf(), getClass().getName());
    // This is the addition - it will make hadoop look for other classes in the same     jar that contains this class
    job.getInternalJob().setJarByClass(getClass());
    job.setVertexClass(getClass());
    ...
}

SETJARBYCLASCLASCLASS () FAIRE HADOOOP recherchez les classes manquantes du même pot contenant la classe renvoyée par GetClass (), et nous n'aurons pas besoin d'ajouter le nom JAR de travail séparément à l'option -Libjars.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top