我想在下列情况下请你帮忙。
我目前正在使用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包含语言方法:
我做错了什么?
提前致谢,
彼得
答案 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
方法。