読者です 読者をやめる 読者になる 読者になる

Miscellaneous notes

主に技術的な雑記的な

KCL for Pythonを試してみる

この記事は、AWS Advent Calendar 2014 - Qiitaの8日目(もう9日になっちゃいましたが)の記事です。

これからPythonをやることになったので、 兼ねてより気になっていたKCL(Kinesis Client Library) for Pythonを試してみようかと思いやってみました。

試しに何か作ってみようってことで安易なんですが、

Twitter Streaming APIからストリームデータを取得してKinesisへ流す
②KCLで受けて特定のワードが出てきたらGraphiteに送信
③グラフ化

という感じの(準)リアルタイムトレンドグラフみたいなものを考えました。

こんな感じですね。

f:id:FumblePerson:20141209102913p:plain

…が、大半できた所で謎のエラーでハマり、時間切れになりましたorz
原因追求して追試したいと思いますが…
やってみて、けっこうコレつらいやつなのではと思いましたw

手順とか

まず、使用したソースコード等はコチラになります。

marcy-terui/aws-kclpy-adcal · GitHub

基本的に、Vagrant + Chefで環境構築していますので、
細かい手順はソースコードを読んでいただく形になります。ご了承ください。

Streamを作成

以下のコマンドを実行します(要aws-cli

aws kinesis create-stream --region us-east-1 --stream-name aws-kclpy-adcal --shard-count 1

Python + boto(SDK for Python) + tweepy のworkerインスタンスを作成

supermarket(Chef公式)のPython Cookbookでそれぞれインストールし、
supervisordで起動する形です。
こちらはプログラム含め、サクっとできました。

python Cookbook - Chef Supermarket

boto/boto · GitHub

tweepy/tweepy · GitHub

③Graphiteインスタンスを作成

こちらは、以前自分で作ったCookbookがあったのでコレを利用しました。

marcy-cookbooks/graphite · GitHub

http://graphite.wikidot.com/

Graphite - Scalable Realtime Graphing - Graphite

Python + KCL for Pythonインスタンスを作成

同じく、supermarketのPython Cookbookでインストールし、supervisordで起動。

marcy-cookbooks/graphite · GitHub

awslabs/amazon-kinesis-client-python · GitHub

ちなみに、起動コマンドはKCL for PythonのREADMEにも書いていますが、
以下のようなコマンドを叩くとクソ長い実行コマンドが「出力」されます。

/usr/local/bin/amazon_kclpy_helper.py --print_command --java /usr/bin/java --properties /vagrant/kcl/kcl.properties

えっと、、、なんで出力なんでしょうね?w
そのまま「実行」してくれるオプションは無いのでしょうか…

ちなみにこんなんが出ます。

/usr/bin/java -cp /usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/commons-codec-1.3.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-annotations-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/commons-logging-1.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/httpcore-4.2.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-databind-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-core-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/httpclient-4.2.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/joda-time-2.4.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/amazon-kinesis-client-1.2.0.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/aws-java-sdk-1.7.13.jar:/vagrant/kcl com.amazonaws.services.kinesis.multilang.MultiLangDaemon kcl.properties

はい、クソ長いですね。
そして、お気づきでしょうか?

Javaを実行してますね。

このKCL for Python、実はJavaのKCLが用意している、
MultiLangDaemonのインターフェースを実装しているだけなんです。

で、このエラー。

12 08, 2014 5:47:55 午後 com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor stopProcessing
重大: Failed to start client executable
java.io.IOException: Cannot run program "/vagrant/kcl/word_count_to_graphite.py": error=2, そのようなファイルやディレクトリはありません
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.startProcess(MultiLangRecordProcessor.java:274)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.initialize(MultiLangRecordProcessor.java:112)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitializeTask.call(InitializeTask.java:74)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:48)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:23)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: error=2, そのようなファイルやディレクトリはありません
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 9 more

12 08, 2014 5:47:55 午後 com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor stopProcessing
重大: Encountered error while trying to shutdown
java.lang.NullPointerException
    at com.amazonaws.services.kinesis.multilang.MessageWriter.close(MessageWriter.java:163)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.childProcessShutdownSequence(MultiLangRecordProcessor.java:186)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.stopProcessing(MultiLangRecordProcessor.java:249)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.initialize(MultiLangRecordProcessor.java:118)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitializeTask.call(InitializeTask.java:74)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:48)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:23)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

「そのようなファイルやディレクトリはありません」って、あるんですけど…

PythonやってるつもりがJavaのエラーと格闘する羽目になってつらい…

ということで、明日(というか今日)9日目はmaroon1stさんです!

AWS Advent Calendar 2014 - Qiita