Pregunta

Estoy tratando de ejecutar los caminos más cortos del ejemplo de la incubadora GIRAPH (> https://cwiki.apache.org/confluence/display/giraph/shortest+paths+example ). Sin embargo, en lugar de ejecutar el ejemplo de las dependencias GIRAPH - *, he creado mi propio jarro de trabajo. Cuando creé un solo archivo de trabajo como se presenta en el ejemplo, me estaba recibiendo

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

Luego, he movido las clases interiores (simpleshortestpathsvertexinportformat y simpleshortestpathsvertexoutputformat) para separ archivos y renombrado en caso de que (SimpleShortStPathSvertexInpormArt_v2, SimpleShortSpathSvertexOutputFormat_v2); Las clases ya no son estáticas . Esto se ha resuelto los problemas de clase no encontrados para el SIMPLESHORTSTPATHSVERTEXIRCUMFORMAY_V2, sin embargo, todavía estoy recibiendo el mismo error para el simpleshortestpathsvertexoutputformat_v2. Abajo es mi rastro de pila.

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

He inspeccionado mi jarro de trabajo y todas las clases están ahí. Además, estoy usando Hadoop 0.20.203 en un modo de pseudo distribuido. La forma en que lanzo mi trabajo se presenta a continuación.

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

También he definido hadoop_classpath para los giraph - * - dependencias.jar. Puedo ejecutar el ejemplo de PageRankBenchmark sin un problema (directamente desde la giraph - * - dependences.jar), y el ejemplo de la ruta de los ajustes también funciona (también directamente desde la giraf - * - dependences.jar). Otros trabajos de Hadoop trabajan sin problemas (en algún lugar donde he leído para probar si mi "clúster" funciona correctamente). ¿Alguien se encontró con un problema similar? Cualquier ayuda será apreciada.


solución (lamento publicarlo así, pero no puedo responder a mi propia pregunta por un par de horas más)

Para resolver este problema, tuve que agregar mi tarro de trabajo a los -Libjars (no hay cambios en Hadoop_Classpath donde se fabrican). El comando para lanzar trabajo ahora se ve así.

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

Lista de tarros tiene que ser separada por comas. Aunque esto ha resuelto mi problema. ¿Todavía tengo curiosidad por qué tengo que pasar mi tarro de trabajo como un parámetro "Classpath"? ¿Puede alguien explicarme lo que es lo racional detrás de esto? Como me pareció extraño (por decir lo menos) para invocar mi tarro de trabajo y luego pasarlo de nuevo como un frasco "ClassPath". Tengo mucha curiosidad por la explicación.

¿Fue útil?

Solución

Encontré una solución programática alternativa al problema. Necesitamos modificar el método Ejecutar () de la siguiente manera -

...
@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 () hará que Hadoop busque las clases faltantes en el mismo frasco que contenga la clase devuelta por GETCLASS (), y no necesitaremos agregar el nombre del jarra de trabajo por separado a la opción -libjars.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top