Apache Nutch: FetcherJob вызывает исключение NoSuchElementException глубоко в Gora

#java #apache #nutch #gora

#java #apache #nutch #gora

Вопрос:

Я запускаю Apache Nutch 2.3.1 из коробки, который использует Gora 0.6.1. Я следовал инструкциям здесь: http://wiki.apache.org/nutch/RunNutchInEclipse

Все прошло нормально с InjectorJob .

Теперь я запускаю FetcherJob , и Gora использует MemStore в качестве хранилища данных. У меня есть gora.properties содержащий

 gora.datastore.default=org.apache.gora.memory.store.MemStore
  

Это выдает:

 2016-10-02 22:55:54,605 ERROR mapreduce.GoraRecordReader (GoraRecordReader.java:nextKeyValue(121)) - Error reading Gora records: null
2016-10-02 22:55:54,605 INFO  mapred.MapTask (MapTask.java:flush(1460)) - Starting flush of map output
2016-10-02 22:55:54,614 INFO  mapred.LocalJobRunner (LocalJobRunner.java:runTasks(456)) - map task executor complete.
2016-10-02 22:55:54,615 WARN  mapred.LocalJobRunner (LocalJobRunner.java:run(560)) - job_local874667143_0001
java.lang.Exception: java.lang.RuntimeException: java.util.NoSuchElementException
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.RuntimeException: java.util.NoSuchElementException
    at org.apache.gora.mapreduce.GoraRecordReader.nextKeyValue(GoraRecordReader.java:122)
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:556)
    at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.NoSuchElementException
    at java.util.concurrent.ConcurrentSkipListMap.firstKey(ConcurrentSkipListMap.java:2036)
    at org.apache.gora.memory.store.MemStore.execute(MemStore.java:128)
    at org.apache.gora.query.impl.QueryBase.execute(QueryBase.java:73)
    at org.apache.gora.mapreduce.GoraRecordReader.executeQuery(GoraRecordReader.java:67)
    at org.apache.gora.mapreduce.GoraRecordReader.nextKeyValue(GoraRecordReader.java:109)
    ... 12 more
2016-10-02 22:55:55,383 INFO  mapreduce.Job (Job.java:monitorAndPrintJob(1360)) - Job job_local874667143_0001 running in uber mode : false
2016-10-02 22:55:55,385 INFO  mapreduce.Job (Job.java:monitorAndPrintJob(1367)) -  map 0% reduce 0%
2016-10-02 22:55:55,387 INFO  mapreduce.Job (Job.java:monitorAndPrintJob(1380)) - Job job_local874667143_0001 failed with state FAILED due to: NA
2016-10-02 22:55:55,396 INFO  mapreduce.Job (Job.java:monitorAndPrintJob(1385)) - Counters: 0
Exception in thread "main" java.lang.RuntimeException: job failed: name=, jobid=job_local874667143_0001
    at org.apache.nutch.util.NutchJob.waitForCompletion(NutchJob.java:119)
    at org.apache.nutch.fetcher.FetcherJob.run(FetcherJob.java:205)
    at org.apache.nutch.fetcher.FetcherJob.fetch(FetcherJob.java:251)
    at org.apache.nutch.fetcher.FetcherJob.run(FetcherJob.java:314)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.nutch.fetcher.FetcherJob.main(FetcherJob.java:321)
  

Это происходит так глубоко в Nutch и Gora, что я понятия не имею, почему это происходит. Я попытался перейти на Gora 0.8, но та же проблема. Я попытался понизить Gora до 0.6, та же проблема. Я хотел переключиться на другое хранилище данных, такое как HBase, но это немного перебор для того, что мне нужно в данный момент.

Пожалуйста, помогите мне разобраться в этом.

Комментарии:

1. Вы правы с Apache Nutch 2.3.1 и Gora 0.6.1, но почему вы пытаетесь сканировать с помощью MemStore? Он выбросит все результаты сразу после завершения.

2. Я использую локальную установку HBase, и проблем нет. Я проверю, что происходит с MemStore, но я рекомендую вам переключиться на HBase.

3. Кстати, если я не ошибаюсь, когда вы выполняете «выборку» с помощью MemStore, данные должны быть пустыми. Новая JVM, новый объект Map (пустой). — О, теперь я вижу, что вы работаете внутри Eclipse. Я никогда не пробовал этого.

4. Это исправленная ошибка в более поздней версии Gora.

5. Добавлен патч, чтобы вы могли использовать Gora-0.7-SNAPSHOT с Nutch 2.3.1 (или, по крайней мере, он работает с веткой 2.x)

Ответ №1:

Я подтверждаю, что проблема в MemStore.

В версии 0.6.1 есть ошибка: https://github.com/apache/gora/blob/apache-gora-0.6.1/gora-core/src/main/java/org/apache/gora/memory/store/MemStore.java#L128

Это уже решено в master: https://github.com/apache/gora/blob/master/gora-core/src/main/java/org/apache/gora/memory/store/MemStore.java#L155 , доступ к #FirstKey() имеет защитный #isEmpty()

НО не пытайтесь обновиться до Gora 0.7-SNAPSHOT, потому что Nutch к этому времени не адаптирован.

Редактировать

Если вы хотите использовать Gora-0.7-SNAPSHOT с Nutch 2.x, возможно, вы могли бы заставить его работать, делая это:

  1. Загрузите главную ветку Gora с версией 0.7-SNAPSHOT
  2. Выполните mvn install в gora/, чтобы установить его в локальный репозиторий maven
  3. Примените этот патч к Nutch: https://paste.apache.org/jjqz таким образом, Nutch 2.3.1 будет работать с Gora 0.7-SNAPSHOT
  4. Выполните учебное пособие Nutch

Надеюсь, это сработает 🙂

Редактировать 2

Что касается использования HBase, довольно легко выполнить локальную установку для экспериментов.

  1. Как указано в Nutch2Tutorial, загрузите HBase 0.98.8-hadoop2
  2. Раздуть tar.gz файл в каталоге, например: /home/you/hbase
  3. cd /home/you/hbase/bin
  4. ./start-hbase.sh

Теперь у вас есть HBase и работает. Настройте Nutch:

ivy/ivy.xml : Посмотрите на комментарий @Emmanuel о конфигурации зависимости ivy от HBase.

gora.properties:

 gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
gora.datastore.autocreateschema=true
gora.datastore.scanner.caching=100
  

nutch-site.xml:

 <configuration>
<property>
 <name>storage.data.store.class</name>
 <value>org.apache.gora.hbase.store.HBaseStore</value>
 <description>Default class for storing data</description>
</property>
</configuration>
  

Выполнено. Для HBase будут использоваться все конфигурации по умолчанию: localhost, /tmp/ …, blablabla

Комментарии:

1. ХОРОШО, как рекомендовано многими людьми, я перешел на HBase вместо MemStore. Я следил за вашим редактированием 2. Я также добавил это в ivy.xml : <организация зависимостей=»org.apache.hbase» name=»hbase-common» rev=»0.98.8-hadoop2″ conf=»->по умолчанию» />rev=»0.98.8-hadoop2″/> <организация зависимостей =»org.apache.gora» name =»gora-hbase» rev =»0.6.1″ conf=» -> по умолчанию» />