2014-12-11

ClojureからApache Sparkを使う

この投稿は Clojure Advent Calendar 2014  11日目の記事です。

Clojure製のライブラリFlamboからApache Sparkをローカル環境で動かしてみたのでいくつかサンプルを紹介します。

Apache Spark自体の説明はApache Spark の紹介(前半:Sparkのキホン) や Apache Sparkってどんなものか見てみる(その1 - 夢とガラクタの集積場 など、とてもわかりやすいスライド・記事があるのでそちらを参照ください。

まずはWordCount。主要な関数はflambo.apiにあるので、Flamboを使う際はまずこちらをrequireすることになります。下記サンプルでは入力データとしてローカルのファイルを使っていますが、hdfs:// から始まればHDFSにあるファイル、s3:// から始まればAmazone S3にあるファイルを入力データとして使うことができます。


次にTwitterのハッシュタグを10 秒ずつスライドさせ期間30秒で集計し、集計数で昇順表示してみます。
Twitterのような無限に流れてくる時系列のデータをリアルタイムに処理したい場合、Sparkの一機能であるSpark Streamingを使うことで可能になります。今回実行するような時間的重なりが発生する集計(例えば21:00:00から21:00:30の集計、次は10秒スライドさせて21:00:10から21:00:40の集計)も可能です。Flambo経由で使う場合はflambo.streamingにある関数を使うことになります。


実行中の画面(画面がどんどん流れていきます)



また、Sparkには処理内容や環境を確認できるWeb UIが用意されおり、もちろんFlamboからSparkを使う場合でも表示できます。
ローカルで動かしている場合は localhost:4040 からアクセスできます。



今回動かしたサンプルはflambo-sampleにあります。(要 Leiningen
Twitterのハッシュタグの集計サンプルを動かす場合、src/twitter4j.propertyを修正後、
$ lein repl
$ (main)
で起動、Ctrl-c Ctrl-d で止まります。
INFOレベル以上のログはデフォルトでコンソールに出力されますが、logs/standard.logに出力するよう変更してます。

お試しください。

2014-09-30

Land of LispのコードをClojureで書いてみる 第10章

進化ゲームをClojureで書いてみた。

構造体にはdefstructを使用し、値が変化するフィールドにはatomを使った。defrecordを使用し、値の変更にはupdate-inを使い、返ってくる新しいレコードを保存するようにしたほうがよかったかもしれない。ループ処理の中身は副作用を伴うのでdoseqを使用した。

起動時。アダムのみ存在


10日後


1000日後


100000日後


2014-09-23

Land of LispのコードをClojureで書いてみる 第9章

オーク・バトルをClojureで書いてみた。
はじめはプロトコルとデータ型を使用して書いてみようとおもったが、変化する値(体力、素早さ、力)の扱いがうまくいかなかったのと、デフォルト実装が扱えない(自分が知らないだけかも)ので、アトムとマルチメソッドの組み合わせで実装した。
あと、プレイヤーの値とモンスターの値をコンソールで見やすくするため、clojure.pprint/print-talbeを使ってみた。

遊んでいる画面。



2014-09-14

Land of LispのコードをClojureで書いてみる 第7章

Graphvizを使ってグラフの生成を行う。 macでhomebrewが入っているなら以下のコマンドでもインストールできる。
brew install graphviz

本と同じようにS式をdotフォーマットに変換してシェルからコマンドを叩いてやるのはめんどくさいので、ClojureからGraphvizを簡単に扱えそうなrhizomeを試しに使ってみた。使用するにはproject.cljに以下を追加。
[rhizome "0.2.1"]


実行結果


本と同様にwizard-nodesのvalue値もnode部分に表示したかったが、graphvizを使用した際にどのように渡せばよいかわからなかった。

2014-09-04

Land of LispのコードをClojureで書いてみる 第5章

本に書いてあるCommon Lisp版のソースでは文字列を使うのを避けていたが、Clojureで書くときは使ったほうが便利なので使用した。