2014年1月12日日曜日

CDH 4.5に移行したらFlume agentが動かなくなった

年末年始の休みでアップグレードしようと思ってたのが作業できてなかったので、忘れないうちにと思って3連休の初日にCloudera Manager 4.8 + CDH 4.5の環境に移行してみた。移行作業自体は何の問題も無く終わったんだけど新しくしてから全サービス起動して問題ないか見て回ってたら不審な点に気付いてしまった:

Flumeからデータが流れてきてないw

いやこれ本番環境とかだったら全然笑えない事態だけど。Cloudera Managerからログを調べてみたらagentがエラー吐いてた:

Unable to start EventDrivenSourceRunner: { source:com.cloudera.flume.source.TwitterSource{name:Twitter,state:IDLE} } - Exception follows.
java.lang.NoSuchMethodError: twitter4j.FilterQuery.setIncludeEntities(Z)Ltwitter4j/FilterQuery;
 at com.cloudera.flume.source.TwitterSource.start(TwitterSource.java:141)
 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:441)
 at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
 at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
 at java.lang.Thread.run(Thread.java:662)

Twitter4Jのところで存在しないメソッドを呼び出すとかアホなことしてる。これ原因は判ってしまえば簡単で、CDH 4.5に入っているTwitter4JのバージョンとFlume agentが使っているTwitter4Jのバージョンが違うのが問題だった。以前のCDHにはTwitter4Jは含まれてなかったのでFlume agentのjarに入れてあったんだけどCDH 4.5側のTwitter4Jを先に見付けてしまって誤動作するという昔懐かしいDLL HELLみたいな状況が起きてた。

判ってしまえば対処も簡単でCDH 4.5用にpomを書き換えてFlume agentをビルドし直してデプロイ、サービス再起動で問題なくデータが流れ始めた。

fork元の cloudera/cdh-twitter-example に差分が来てたのでそれらを kmizumar/cdh-twitter-example に取り込んだだけ。

どうしてCDH 4.5にTwitter4Jが入っているのか、は気が向いたら書きます。

2 件のコメント:

  1. You need to recompile flume-sources-1.0-SNAPSHOT.jar from the git:https://github.com/cloudera/cdh-twitter-example

    Install Maven, then download the repository of cdh-twitter-example.

    Unzip, then execute inside (as mentionned) :

    $ cd flume-sources

    $ mvn package

    $ cd ..

    This problem happened when the twitter4j version updated from 2.2.6 to 3.X, they removed the method setIncludeEntities, and the JAR is not up to date.

    PS: Do not download the prebuilt version, it is still the old.

    返信削除
  2. Thank you for your comment, Kevin. Yes, the root cause is Twitter4J jar file is not updated in my forked version of cdh-twitter-example. I've solved this problem by changing dependency entity in pom.xml. I feel it's like a kind of problem called "DLL HELL" in Windows platform ;-)

    返信削除