この記事は、AWS Advent Calendar 2014 - Qiitaの8日目(もう9日になっちゃいましたが)の記事です。
これからPythonをやることになったので、 兼ねてより気になっていたKCL(Kinesis Client Library) for Pythonを試してみようかと思いやってみました。
試しに何か作ってみようってことで安易なんですが、
①Twitter Streaming API
からストリームデータを取得してKinesisへ流す
②KCLで受けて特定のワードが出てきたらGraphiteに送信
③グラフ化
という感じの(準)リアルタイムトレンドグラフみたいなものを考えました。
こんな感じですね。
…が、大半できた所で謎のエラーでハマり、時間切れになりました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
③Graphiteインスタンスを作成
こちらは、以前自分で作ったCookbookがあったのでコレを利用しました。
marcy-cookbooks/graphite · GitHub
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さんです!