RのGearman Worker作ってみた(Perl経由だけど)

Tsukuba.R でネタをやらなきゃいけないことになったので、この週末に無い頭をひねってなんとかネタを作り出しました。思ってたよりおもしろいなぁと思ったので、とりあえず動くものができたところで上げてしまいます。ツッコミ大歓迎!

R をブラウザから使ってみたい

WEB 屋さんとしてはやっぱブラウザ経由でなんかやってみたくなるものです。というわけで R をブラウザから使うというネタを考えました。データをアップロードして好きな R を実行させると、結果(主に画像)が表示されるとかできたらかっこいいですよね!

。。。

。。。

ありました。。。。

やー素晴らしいですね。テキストエリアにコード打ち込んで実行させるとかっこよく画像でるし、データのアップロードとかもできるし。。。俺やることないわー。。。ないわー

ちなみに、古いかもだけどソースも落とせてチラ見してみましたが、Perl を CGI で普通に動かしてて、system 関数で R を呼んでました。

R で WEB ページを作ってみる

だったら、ページ作るところも R でやればいんじゃね!と思ったら丁度rApacheというのがありました。Apache のモジュールとして mod_R を読んであげる感じです。

。。。

。。。

ただ、、、これも紹介されてるyeroon.net/ggplot2ってのがよくできすぎ。。。

てかさ、R って統計言語なんだから WEB のレンダリングとかやるもんじゃないよね。。。

だったら R でデーモンだ!

R は分析に専念させるという意味では、WEB からのキューを処理するワーカーみたいな感じにできた方がいいと思ったので、R をデーモンにできないか調べました。

**【注意】**ここで人生初の R コーディング。

とかいう状況で、調べてもよくわかんない>< TCP のソケット通信はやり方が何となく分かったものの、シグナルわかんなかったし、UNIX ドメインソケットもわかんなかったし、つーか、そもそも R ってデーモン書くための言語じゃないよねとか思って挫折。。。

さてそろそろ本気出す

そもそも、役に立つ、かっこいい、まだ誰も作ってないものをいきなり作ろうとか思ったのが間違いなので、自分の勉強のためと割りきってネタを準備することにしました。

キューを処理するワーカーと言えば、最近は Gearman が流行りだと風の噂に聞いていたのを思い出し、せっかくなので Gearman やってみようと思いました。しかし、Gearman のサイトを見る限り R のライブラリはなさそう。まぁこれを作るってのもある意味ネタですが、R はデーモン書くためにあるんじゃないのでパス。

というわけで、素直に Gearman のワーカーは Perl で書いて、その中で R を毎度起動する形にしました。Perl の Gearman 周りはかなり情報もあるので、結構さくっと書くことができました。ついでなので、Parallel:Prefork をかませてみたのでワーカーを複数プロセス起動させるのも楽チン!コードは github にあるよ!

シンプルにすることを心がけつつ、汎用性をなるべく高めてみました。特に Perl を普段使わない人にも使ってほしいなと思ったので、R の実行に必要な情報はワーカーの config とあとは Gearman のクライアントから JSON で渡す様にしました。なので、キューを入れる側は Perl である必要ななくて、Gearman のライブラリがある PHP とか Ruby とかで書いた WEB アプリからでもキューを入れられます。

そしてワーカーの方でもどの R スクリプトを起動するかは毎度キューに与えられるので、スクリプトを入れ替えるためにワーカーに手を入れたり再起動したりする必要はありません。R は与えられた情報を元に処理を行い、ログに出しておきたいものは標準出力に書く様にすれば、それを後で Perl が拾ってくれてファイルに書いてくれます。まぁ書き方は R 書く人にまかせますが、これも JSON で出しておけば WEB アプリ側で拾うのが簡単だと思います。

小さい R スクリプトを準備していてそれを source 関数で読み込んでおくことで、クライアントから受け取る JSON をパースする部分とか JSON にしてプレフィックスをつけて書きだす処理とか、最後終わったことを書きだす処理とかを R の関数一つでできる様にしています。

個人的には、デーモンプロセスの管理は Perl で、実際の統計分析だけ R で、という形にできて得意領域をうまく活用できたかなーと思ってたりします。両方共 1 つの言語でやる必要ないよねーと。Gearman も結構いろんな言語で使えるので、最初の想定よりもかなり汎用性が高いと自分では思っています><

あとは Tsukuba.R でのお楽しみー

ワーカー動かすには CPAN モジュールが必要になりますが、最近の Perl 慣れてない人が root の cpan コマンドとかで入れるとかすると悲惨なので cpanm での入れ方とかも含めて紹介しますから、Perl 苦手って人は焦って入れない方がいいかもw

Perl な人は R が入ってれば多分動くので、(Gearman なければ cpanm Gearman::Server して)Gearman 上げて、script/Rworker.pl起動した状態で、script/sample/Rclient_sample.plを叩くといいかも。Mac でしか試してないけど。

というわけで、あとはこれに WEB のインタフェース付けて発表する予定。Ajax でポーリングとか書いたこと無いのでそれの勉強ついでに。

久々、真面目に日曜プログラミングできて充実した週末でしたとさ。Tsukuba.R よろしくー