Flume - TwitterSource 语言过滤器
Flume - TwitterSource language filter
在以下情况下,我想请求您的帮助。
我目前正在使用 Cloudera CDH 5.1.2,并且我尝试使用 Flume 收集 Twitter 数据,如以下端口 (Cloudera) 中所述:
- http://blog.cloudera.com/blog/2012/10/analyzing-twitter-data-with-hadoop-part-2-gathering-data-with-flume/
- github.com/cloudera/cdh-twitter-example
我下载了源代码并在 pom.xml:
中更新版本后重建了 flume-sources
<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-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):
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.access1(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-stream包含语言方法:
- github.com/yusuke/twitter4j/blob/3.0.6/twitter4j-stream/src/main/java/twitter4j/FilterQuery.java
我做错了什么?
提前致谢,
彼得
我用 cdh3
试过了,效果很好。我注意到的一件事是系统时间应该设置为当前时间。在你的情况下,我认为它正在寻找 FilterQuery
class.
中的 Language
方法
最后我设法解决了这个问题。所以这里是所有面临同样问题的人的解决方案。
首先(在上面的例子中是原来的 post)我把我生成的 jar 放到 /var/lib/flume-ng/plugins.d/twitter-streaming/lib/
,并在 Cloudera Manager 配置中设置它以使用这个位置。
在这种情况下,CM 将此目录放置在运行器文件中的类路径中(在 parcel 目录之后)。所以类路径中的目录顺序如下所示:
/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,在那个版本中 FilterQuery.language
显然不存在。
所以我刚刚从 parcel 目录中删除了那些 jar,现在可以正常工作了。
在以下情况下,我想请求您的帮助。
我目前正在使用 Cloudera CDH 5.1.2,并且我尝试使用 Flume 收集 Twitter 数据,如以下端口 (Cloudera) 中所述:
- http://blog.cloudera.com/blog/2012/10/analyzing-twitter-data-with-hadoop-part-2-gathering-data-with-flume/
- github.com/cloudera/cdh-twitter-example
我下载了源代码并在 pom.xml:
中更新版本后重建了 flume-sources<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-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):
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.access1(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-stream包含语言方法:
- github.com/yusuke/twitter4j/blob/3.0.6/twitter4j-stream/src/main/java/twitter4j/FilterQuery.java
我做错了什么?
提前致谢,
彼得
我用 cdh3
试过了,效果很好。我注意到的一件事是系统时间应该设置为当前时间。在你的情况下,我认为它正在寻找 FilterQuery
class.
Language
方法
最后我设法解决了这个问题。所以这里是所有面临同样问题的人的解决方案。
首先(在上面的例子中是原来的 post)我把我生成的 jar 放到 /var/lib/flume-ng/plugins.d/twitter-streaming/lib/
,并在 Cloudera Manager 配置中设置它以使用这个位置。
在这种情况下,CM 将此目录放置在运行器文件中的类路径中(在 parcel 目录之后)。所以类路径中的目录顺序如下所示:
/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,在那个版本中 FilterQuery.language
显然不存在。
所以我刚刚从 parcel 目录中删除了那些 jar,现在可以正常工作了。