Domanda

Sto cercando di eseguire l'esempio dei percorsi più corti dall'incubatore Giraph ( https://cwiki.apache.org/confluence/display/giraph/shortest+aths+Example ). Tuttavia, invece di eseguire l'esempio da Giraph - * - dipendenze.jar, ho creato il mio jar del lavoro. Quando ho creato un singolo file di lavoro come presentato nell'esempio, stavo ottenendo

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

Poi ho spostato le classi interne (SimpleshortTathsvertExinputFormat e SimpleshortPathSverTexoutputFormat) per separare i file e riportarli solo nel caso in cui (SimpleshortStathSvertexInputFormat_v2, SimpleshortPathsvertExoutputformat_v2); Le classi non sono più statiche . Ciò ha risolto le questioni della classe non trovata per SimpleShortCathsvertexInputFormat_v2, tuttavia sto ancora ottenendo lo stesso errore per il SimpleshortTathsvertexoutputformat_v2. Di seguito è riportata la mia traccia dello stack.

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
.

Ho ispezionato il mio Job Jar e tutte le classi ci sono. Inoltre sto usando hadoop 0.20.203 in una modalità distribuita pseudo. Il modo in cui lancio il mio lavoro è presentato qui sotto.

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
.

Inoltre ho definito hadoop_classpath per la giraph - * - dipendenze.jar. Posso eseguire l'esempio di PageRankBenchmark senza problemi (direttamente dalla Giraph - * - dipendenze.jar), e l'esempio dei percorsi di shorts funziona pure (anche direttamente dalla Giraph - * - dependencies.jar). Altri lavori di Hadoop funzionano senza problemi (da qualche parte ho letto per testare se il mio "cluster" funziona correttamente). Qualcuno si è imbattuto in un problema simile? Qualsiasi aiuto sarà apprezzato.


.

soluzione (mi dispiace postarlo come questo, ma non posso rispondere alla mia domanda per un paio di ore più ore)

Per risolvere questo problema ho dovuto aggiungere il mio barattolo di lavoro ai -libjars (nessuna modifica a hadoop_classpath dove fatta). Il comando per lanciare il lavoro ora sembra questo.

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
.

Elenco dei barattoli deve essere separata da virgola. Anche se questo ha risolto il mio problema. Sono ancora curioso del motivo per cui devo passare il mio Job Jar come parametro "classpath"? Qualcuno può spiegarmi qual è il razionale dietro questo? Come ho trovato strano (a dir poco) per invocare il mio Job Jar e poi passalo come un barattolo "classpath". Sono davvero curioso della spiegazione.

È stato utile?

Soluzione

Ho trovato una soluzione programmatica alternativa al problema. Dobbiamo modificare il metodo RUN () nel modo seguente -

...
@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());
    ...
}
.

Setjarbyclass () renderà look adoop per le classi mancanti nello stesso barattolo che contiene la classe restituita da GETCLASS (), e non avremo bisogno di aggiungere il nome del JAR JAR separatamente all'opzione -Libjars.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top