Flume - TwitterSource语言过滤器

时间:2015-01-12 12:11:07

标签: hadoop twitter flume cloudera-cdh flume-twitter

我想在下列情况下请你帮忙。

我目前正在使用Cloudera CDH 5.1.2,我尝试使用Flume收集Twitter数据,如以下porsts(Cloudera)中所述:

我在更新pom.xml中的版本后下载了源代码并重建了flume-sources:

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

效果很好。

之后我想添加一个“语言”过滤器,只捕获特定语言的推文。为此,我修改了TwitterSource.java,以某种方式调用FilterQuery.language方法:

  

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

我正在尝试使用twitter4j-stream 3.0.6版。我在pom.xml中更新了它:

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

通过这些设置,我重建了jar(mvn包)。

当我启动我的代理时,我得到以下异常(NoSuchMethodError):

  

无法启动EventDrivenSourceRunner:{source:com.cloudera.flume.source.TwitterSource {name:Twitter,state:IDLE}} - 以下是例外情况。   java.lang.NoSuchMethodError:twitter4j.FilterQuery.language([Ljava / lang / String;)Ltwitter4j / FilterQuery;   在com.cloudera.flume.source.TwitterSource.start(TwitterSource.java:165)   在org.apache.flume.source.EventDrivenSourceRunner.start(EventDrivenSourceRunner.java:44)   在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)   在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)   at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)   在java.lang.Thread.run(Thread.java:745)

我查了一下,这个版本的twitter4j-stream包含语言方法:

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

我做错了什么?

提前致谢,

彼得

2 个答案:

答案 0 :(得分:1)

最后我设法解决了这个问题。所以这里是面向同一问题的任何人的解决方案。

首先(在原帖中的上述情况中)我将生成的jar放到/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/*

不幸的是,在parcel目录中有一个twitter4j-stream-3.0.3.jar和twitter4j-core-3.0.3.jar,并且flume尝试使用它而不是3.0.6,并且在那个版本中{{1显然不存在。

所以我刚刚从parcel目录中删除了这些jar,现在工作正常。

答案 1 :(得分:0)

我用cdh3尝试了这个,它对我很好。我注意到的一件事是系统时间应该设置为当前时间。在您的情况下,我认为它在Language类中查找FilterQuery方法。