2014年1月18日土曜日

Java 7 Update 51 on MacOSX 10.9.1

Java7 Update 51が来てたので早速インストールしておいたんだけど:


shellから確認するとJava 7 Update 45のままなのはどうしてなの?


2014年1月13日月曜日

2つのTwitterSource.java

CDH 4.5に含まれるFlume-NGにはTwitterからデータを取得するためのTwitterSourceクラスが含まれるようになっています。これがCDH 4.5にTwitter4Jが同梱されるようになった理由。実際こんな感じでjarファイルが転がっているのが見て取れます。

% cd /opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30/lib/flume-ng/lib
% ls -lF twitter*
-rwxr-xr-x 1 root root 283752 Nov 21 11:07 twitter4j-core-3.0.3.jar*
-rwxr-xr-x 1 root root  27690 Nov 21 11:07 twitter4j-media-support-3.0.3.jar*
-rwxr-xr-x 1 root root  56262 Nov 21 11:07 twitter4j-stream-3.0.3.jar*

これだけで終わってもいいのですが折角なので混乱を招くのではないかと思うTwitterSource.javaについて書いておきます。

世の中には2つのTwitterSource.javaがある

cdh-twitter-example版

  • com.cloudera.flume.source.TwitterSource
  • TwitterのSample APIを叩く
    • 指定されたキーワードを含むものが取得できる
  • フォーマットはいじらずに後段に流す
コードからコメント抜いてくるとこう書いてある:

/**
 * A Flume Source, which pulls data from Twitter's streaming API. Currently,
 * this only supports pulling from the sample API, and only gets new status
 * updates.
 */


Flume-NG版

  • org.apache.flume.source.twitter.TwitterSource
  • TwitterのStreaming APIを叩く
    • Firehoseで取得できるものの1%がサンプリングされるらしい
  • Avroフォーマットにして後段に流す
コードからコメント抜いてくるとこう書いてある:

/**
 * Demo Flume source that connects via Streaming API to the 1% sample twitter
 * firehose, continously downloads tweets, converts them to Avro format and
 * sends Avro events to a downstream Flume sink.
 *
 * Requires the consumer and access tokens and secrets of a Twitter developer
 * account
 */


まとめ

早い話がClouderaが作ったTwitterSource便利だからApache Software Foundationに寄贈してFlume-NGに取り込まれたけどちょっと機能が変わってますね、ということでした。

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が入っているのか、は気が向いたら書きます。