Docker上でCojureのデータ解析ツールGorilla REPLを動かす


前書き

Gorilla REPLはClojure製のノートブックスタイルのデータ解析ツールです。
Clojure版のiPython Notebookと言った方がイメージしやすいでしょうか。

Docker imageを作りましたので、今回はCoreOS上で動かすやり方を説明します。

準備

以下のインストールが事前に必要です。

CoreOSの起動

CoreOSの公式Vagrantfileを使用します。
デフォルトだと1台だけ起動します。

git clone https://github.com/coreos/coreos-vagrant/
cd coreos-vagrant
vagrant up

コンテナの起動

あとはログインして以下のコンテナを起動するだけです。
naohisa/incanter-gorilla

docker run --name some-gorilla -p 4242:4242 -p 80:8080 -d naohisa/incanter-gorilla

Notebookを開く

特に設定を変更していなければ以下のURLをブラウザで開けばアクセスできます。
http://172.17.8.101/worksheet.html

leiningenのreplだと以下のコマンドで開けます。(nREPL等でもエンドポイントは一緒)

lein repl :connect 172.17.8.101:4242

以下のように表示されれば成功です。

データベースから情報を引っ張る

まずはnamespaceとライブラリの読み込みをするため、以下を入力してshift + enterします。

(ns divine-meadow
  (:require [clojure.java.jdbc :as jdbc])
  (:use [incanter core stats charts io datasets]
        [incanter-gorilla render]))

データベースへの接続情報を以下のような感じで定義しておきます。

(def db-info
  { :subprotocol "mysql"
    :subname "//[database host]:3306/database"
    :user "user_name"
    :password "password"})

jdbc経由でデータをとって来るには以下のようにします。

(def hoge-data
  (jdbc/query db-info
    ["select * from hoge where id > ? " "10"]))))

この場合、hoge-dataは遅延シーケンスでデータ的にはmapです。
これをIncanterで処理できるようにdatasetに変換します。

(def hoge-dataset
  (to-dataset hoge-data))

あとは以下のような感じで平均値を求めたり、グラフの描画もできます。

(mean ($ :price ($where {:year {= 2015}} hoge-dataset)))
(chart-view
  (scatter-plot :price :amount :group-by :month :data hoge-dataset))

現状の課題

  • このコンテナイメージはGorilla REPLの実行ユーザがrootなので、いずれ起動用のユーザを追加して実行するように修正したいです。
  • 起動時に任意のライブラリの読み込みが指定できるようにしたいです。