宣言していた通り、Clojure+Leiningenでやや簡単にGAEアプリをつくれるようにしてみました。
blankプロジェクトはこちら。
Compojureは最新の0.4.0のスナップショットをjarに固めてClojarsにおきました。
leiningenのインストールがまだの場合はこちらを参考にインストールしてください。
Google App Engine SDKを用意していない場合はここからDLしてきてbinディレクトリをパスに追加してください。いまのところ1.3.1対応です(appengine-java-sdk-1.3.1.zip)
$ git clone git://github.com/making/clj-gae-blank.git $ cd clj-gae-blank $ lein compile # 開発版サーバ起動 $ dev_appserver war # -> http://localhost:8080/にアクセスすると「Hello!」と出るはず。 # 本番環境へデプロイ $ vi war/WEB-INF/appengine-web.xml # applicationタグ内に自分のAPPIDを記入 $ appcfg.sh update war # -> http://APPID.appspot.com/にアクセスすると「Hello!」と出るはず。
あとはソースみていじってください。コードは数行しか書いてないから雰囲気でわかると思います。
lein replでwar/WEB-INF/classes, libにパスが通っていないみたいなので、projectホームに、シンボリックリンクを貼った方が良いです。ln -s war/WEB-INF/classes,ln -s war/WEB-INF/lib。lein-swakを使う場合も同様。
Created at : 2010-03-22 06:15:56
Updated at : 2010-03-22 06:31:06
Category : Programming::Lisp::Clojure::Leiningen
前回の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
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
$ 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