Вопрос

Я пытаюсь запустить кратчайшие пути при примере из инкубатора гирафа ( https://cwiki.apache.org/confluence/display/giraph/shortest+Paths+Example ). Однако вместо того, чтобы выполнить пример из Giraph - * - зависимостей.jar, я создал свою собственную банку работы. Когда я создал один файл работы, как представлено в примере, я получил

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

Тогда я переместил внутренние классы (SimpleShortestPathsvertexInputformat и SimpleShortestPathtexoutputformat) для разделения файлов и переименованы в случае (SimpleShortestPathstvertexInportformat_v2, simpleShortestpathstvertexoutputformat_v2); Классы больше не статичны . Это решило вопросы класса, не найденного для SimpleshoreestPathstvertexinputformat_v2, однако я все еще получаю ту же ошибку для SimpleshoreEstPathstvertexoutphotformat_v2. Ниже приведен мой след стека.

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
.

Я проверил свою работу банку и все классы там. Кроме того, я использую Hadoop 0.20.203 в режиме Pseudo распределенного режима. То, как я запускаю свою работу, представлен ниже.

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
.

Также я определил hadoop_classpath для giraph - * - зависимостей.jar. Я могу запустить пример Pagerankbenchmark без проблем (непосредственно из Giraph - * - зависимостей.jar), а пример шорты пример работает (также непосредственно из giraph - * - зависимости. Другие рабочие места Hadoop работают без проблем (где-то я прочитал, чтобы проверить, если мой «кластер» работает правильно). Кто-нибудь столкнулся с подобной проблемой? Любая помощь будет оценена.


Решение (извините, что публикую это так, но я не могу ответить на свой вопрос на пару часов)

Чтобы решить эту проблему, мне пришлось добавить мою банку работы в -libjars (без изменений в Hadoop_Classpath, где сделано). Команда для запуска работы теперь выглядит так.

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
.

Список банок должен быть разделен запятой. Хотя это решило мою проблему. Мне все еще интересно, почему я должен пройти банку работы как параметр «ClassPath»? Может кто-нибудь объяснить мне, что такое рациональное за этим? Поскольку я нашел это странно (сказать наименее), чтобы вызвать мою банку на работу, а затем передать его снова как банку «классов». Мне действительно интересно объяснение.

Это было полезно?

Решение

Я нашел альтернативное программное решение проблемы. Нам нужно изменить метод Run () следующим образом -

...
@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 () заставит Hadoop искать пропущенные классы в том же банке, который содержит класс, возвращенный GetClass (), и нам не нужно добавить имя JAR JAR отдельно к опции -libjars.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top