Clojure+Hadoop(Cloud) = Cloudure(第一歩)

前回のClojureでHadoopのサンプルのうち、定型処理っぽい部分をマクロにしてみました。
プロジェクト名はClojure + Cloud = Cloudureです。
名前負けしてます。まだいまいち。(ClojureもHadoopもそんな使った事ない。。)

2010/03/07 Clojarsにデプロイしました(namespaceを変えました)
2010/03/22 namespaceをam.ik.cloudureに戻しました

マクロの定義はいまのとここんな感じ。使い方は

;; Mapper、Reducerを別関数にする場合
(defn hello-map [key value context]
  (.write context (Text. key) (IntWritable. (Integet/parseInt value))))
(defn hello-reduce [key values context]
  (.write context key (IntWritable. (reduce + (map #(.get %) values)))))
(defmapreduce hello
  :mapper hello-map
  :reducer hello-reduce)
;; Mapper、Reducerもいっしょに定義する場合
(defmapreduce hello
    :mapper ([key value context] (.write context (Text. key) (IntWritable. (Integet/parseInt value))))
    :reducer ([key values context] (.write context key (IntWritable. (reduce + (map #(.get %) values))))))

前者を展開した場合、

(do
 (gen-class
  :name
  am.ik.cloudure.core.hello.mapper
  :extends
  org.apache.hadoop.mapreduce.Mapper
  :prefix
  "hello-mapper-")
 (defn hello-mapper-map [G__2310 G__2311 G__2312 G__2313]
   (hello-map G__2311 G__2312 G__2313))
  (gen-class
   :name
   am.ik.cloudure.core.hello.reducer
   :extends
   org.apache.hadoop.mapreduce.Reducer
   :prefix
   "hello-reducer-")
  (defn hello-reducer-reduce [G__2314 G__2315 G__2316 G__2317]
    (hello-reduce G__2315 G__2316 G__2317))
  (defn get-hello-job
      ([] (get-hello-job true))
    ([set-jar?]
     (let [job (org.apache.hadoop.mapreduce.Job.)]
       (if set-jar?
           (.setJarByClass job (forName "am.ik.cloudure.core")))
       (doto
        job
        (.setMapperClass
         (forName "am.ik.cloudure.core.hello.mapper"))
        (.setReducerClass
         (forName "am.ik.cloudure.core.hello.reducer")))))
    {:tag java.lang.Class}))

後者は

(do
 (gen-class
  :name
  am.ik.cloudure.core.hello.mapper
  :extends
  org.apache.hadoop.mapreduce.Mapper
  :prefix
  "hello-mapper-")
 (defn hello-mapper-map [this key value context]
   (.write context (Text. key) (IntWritable. (parseInt value))))
  (gen-class
   :name
   am.ik.cloudure.core.hello.reducer
   :extends
   org.apache.hadoop.mapreduce.Reducer
   :prefix
   "hello-reducer-")
  (defn hello-reducer-reduce [this key values context]
    (.write context key (IntWritable. (reduce + (map #(.get %) values)))))
  (defn get-hello-job
      ([] (get-hello-job true))
    ([set-jar?]
     (let [job (org.apache.hadoop.mapreduce.Job.)]
       (if set-jar?
           (.setJarByClass job (forName "am.ik.cloudure.core")))
       (doto
        job
        (.setMapperClass
         (forName "am.ik.cloudure.core.hello.mapper"))
        (.setReducerClass
         (forName "am.ik.cloudure.core.hello.reducer")))))
    {:tag java.lang.Class}))

前回のサンプルのdefmapreduce版はこんな感じ。

まだまだですね。もっとHadoopを使って慣れながら改良していきたいと思います。

一応Cloudureを使うには、Clojarsに上げてあるので、project.cljに↓を追加すればOK

[am.ik/cloudure "0.1.0-SNAPSHOT"]

コメント・アドバイスがあれば@makingまで。

Created at : 2010-03-01 02:34:55   Updated at : 2010-03-22 05:30:54
Category : Programming::Lisp::Clojure

Shibuya.lisp TT#5でLT発表しました。

「Clojure+Leiningenで3分Hadoop」というタイトルでShibuya.lisp TT#5でLTしてきました。
発表資料をおいておきます。
会場を提供して頂いたECナビさん、Shibuya.lisp TT運営の方々ありがとうございました。忙しくなければ次は自分も運営の方を手伝いたい。

スライド

デモ用shellスクリプト

動画はちょっとサイズがでかかった。。。
Download
LinuxかMacでこのスクリプトを叩いてみてください。Hadoop実行までできるといいなw

雑感

多分参加者はClojure祭りだったなーと思うと思うけど、
それをある意味確信的にしたのは、hayamizさんくらいのレベルの高い人が「久々のアタリな言語」と言い切ったのが大きいんじゃないかなーと思う。
clojure-users.orgドメインとったし、みんな「Clojure流行ってるんじゃないか?」という錯覚に陥っているうちに何かアクション起こしたい。(ECナビさん会場かしてくれないかなーw。そんな人あつまらなさそうだけど、、)
何かアドバイスがありましたら@makingまで。
懇親会でもいろいろな人と話せて良かったです。大分FollowしているLisperの方のIDと顔が一致してきました。もし、話した方でぼくがFollowしていなかったら、連絡してくださいw
中でもGAEで使えるならClojure使ってもいいって思っている人が何人かいたのが印象的でした。leiningenかmavenでblankプロジェクト作ってみます。
とりあえずシーランド公国爵位取得したいと思います。

Created at : 2010-03-21 17:41:16   Updated at : 2010-03-21 17:53:41
Category : Document::発表資料

Leiningenインストール

1.1.0がリリースされ少し仕様が変わったみたいです。当分は1.0.1で様子見します(2010/02/22)
調査状況(2010/03/21)
どうもproject.cljの:mainに指定したnamespaceの.cljファイル(およびそこからuseされているファイル)のみコンパイルされる模様。。lein newでは:main入っていないし、何か変じゃないかな?

最新版

最新(安定)版は1.1.0(最終更新日時点)

$ wget http://github.com/technomancy/leiningen/raw/stable/bin/lein
$ sudo install -m 755 lein /usr/local/bin/
$ lein self-install

1.0.1でインストール

$ wget http://github.com/technomancy/leiningen/tarball/1.0.1
$ tar xzvf technomancy-leiningen-fb13db7.tar.gz
$ sudo install -m 755 technomancy-leiningen-fb13db7/bin/lein /usr/local/bin/
$ lein self-install

Created at : 2010-02-01 01:25:23   Updated at : 2010-03-21 02:34:41
Category : Programming::Lisp::Clojure::Leiningen