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よろしくー

hiratake55 11-02-13 (日) 21:29

・R-Node
http://www.squirelove.net/r-node/doku.php

・R-php
http://dssm.unipa.it/R-php/

・RWebUI
http://www.r-webui.net/

というのもあります。ご参考までに。

riywo 11-02-13 (日) 23:40

>hirataka55さん

おぉぉぉぉぉ!なんか一杯ありますねwありがとうございます。
今回作ってるワーカーは、これらのバックエンドで動かせるようなイメージです。