Гирафом кратковременных путей Пример ClassnotFoundException
-
13-12-2019 - |
Вопрос
Я пытаюсь запустить кратчайшие пути при примере из инкубатора гирафа ( 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.