2015-01-12 5 views
1

Я хотел бы попросить вашу помощь в следующем случае.Flume - TwitterSource язык фильтр

настоящее время я использую Cloudera CDH 5.1.2, и я попытался собрать данные Twitter, используя Flume, как описано в следующих porsts (Cloudera):

Я скачал источник и восстановил водоводные-источники после обновления версии в pom.xml:

<flume.version>1.5.0-cdh5.1.2</flume.version> 
<hadoop.version>2.3.0-cdh5.1.2</hadoop.version> 

Он отлично работал.

После этого я хотел добавить фильтр «language», чтобы фиксировать только твиты определенного языка. Для этого я изменил TwitterSource.java вызвать метод FilterQuery.language как-то так:

FilterQuery query = new FilterQuery();
...
if (languages.length != 0) {
query.language(languages);
}

Я пытаюсь использовать twitter4j-потоковую версию 3.0.6. Я обновил его в pom.xml:

<!-- For the Twitter API --> 
<dependency> 
<groupId>org.twitter4j</groupId> 
<artifactId>twitter4j-stream</artifactId> 
<version>3.0.6</version> 
</dependency> 

С этими настройками я перестроил банку (МВН пакет).

Когда я начинаю мой агент, я получаю следующее исключение (NoSuchMethodError):

Unable to start EventDrivenSourceRunner: { source:com.cloudera.flume.source.TwitterSource{name:Twitter,state:IDLE} } - Exception follows. java.lang.NoSuchMethodError: twitter4j.FilterQuery.language([Ljava/lang/String;)Ltwitter4j/FilterQuery; at com.cloudera.flume.source.TwitterSource.start(TwitterSource.java:165) at org.apache.flume.source.EventDrivenSourceRunner.start(EventDrivenSourceRunner.java:44) at org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:251) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)

Я проверил, и эта версия twitter4j-потока содержит метод языка:

  • github.com /yusuke/twitter4j/blob/3.0.6/twitter4j-stream/src/main/java/twitter4j/FilterQuery.java

Что я делаю неправильно?

Спасибо заранее,

Питер

ответ

1

Наконец-то мне удалось решить эту проблему. Итак, вот решение для всех, кто сталкивается с той же проблемой.

Первый (в приведенном выше случае в исходном сообщении) Я поместил свою созданную банку в /var/lib/flume-ng/plugins.d/twitter-streaming/lib/ и настроил ее в конфигурации Cloudera Manager, чтобы использовать это местоположение.

В этом случае CM помещал эту директорию в путь и путь к классам в файле бегун (после каталога посылки).Таким образом, порядок каталогов в пути к классам выглядит следующим образом:

  • /opt/cloudera/parcels/CDH-5.1.2-1.cdh5.1.2.p0.3/lib/flume-ng/lib/*

  • /var/lib/flume-ng/plugins.d/twitter-streaming/lib/*

К сожалению, был twitter4j-поток-3.0.3.jar и twitter4j-core- 3.0.3.jar в каталоге посылки, и flume попытался использовать это вместо 3.0.6, и в этой версии FilterQuery.language явно не существует.

Так что я просто удалил эти банки из каталога посылок, и теперь он отлично работает.

0

Я попытался это с cdh3 и она работала хорошо со мной. Одна из вещей, которые я заметил, - это время системы, которое должно быть установлено на текущее время. В вашем случае, я думаю, что это выглядит Language метод в классе FilterQuery.