Clojure+Leiningenで3分Hadoop

5,295 views

Published on

Clojure+Leiningenで3分Hadoop

  1. 1. Clojure+Leiningen で 3 分 Hadoop Shibuya.lisp TT#5 March 10, 2010 @making ( http://ik.am ) BlogSystem Written By CommonLisp 「 CategoL 」 ( http://github.com/making/categol )
  2. 2. Clojure をインストールした後、 こんな風に思ったことないですか? REPL 起動の仕方が人によって違わない? .clj ファイルをロードしたいけど Could not locate っていわれる クラスパス追加しないといけないの? jar をどこに置けばいいのか分からない 面倒くさい。。。
  3. 3. Leiningen (pronounced “LINE-ing-en”) <ul><li>Clojure のビルドツール </li></ul><ul><ul><li>http://github.com/technomancy/leiningen </li></ul></ul><ul><ul><li>デファクトスタンダードになりつつある </li></ul></ul><ul><li>jar(java アーカイブ ) の依存関係解決 </li></ul><ul><ul><li>maven2 レポジトリから取得する </li></ul></ul><ul><li>クラスパス設定済み REPL ・コンパイル環境を提供 </li></ul><ul><li>Clojure 未インストールの状態からも使える ( 必要なものは Java のみ ) </li></ul>超手軽に Clojure 開発環境構築& Java ライブラリ取得・使用が可能
  4. 4. 例題として Hadoop <ul><li>Leinigen の手軽さを活かし、 Hadoop 本のサンプルプログラム ( 例 2.6: 気象情報データセットから最大温度を取得 ) を実行する </li></ul><ul><li>Clojure 、 Hadoop がインストールされていない想定 </li></ul><ul><ul><li>要 java/git/ ネット環境 </li></ul></ul>
  5. 5. デモ ( 動画 ) <ul><li>leiningen の使い方 ( コマンド一覧 ) は後ろのスライドに記載 </li></ul><ul><li>実行するプログラム : http://bit.ly/9XieeT </li></ul><ul><li>軽く解説記事 : http://bit.ly/bodVU1 </li></ul>
  6. 6. 以下、補足資料
  7. 7. Leiningen の基本的な使い方 <ul><li>http://github.com/technomancy/leiningen/raw/stable/bin/lein </li></ul><ul><ul><li>をダウンロードしてパスを通す </li></ul></ul><ul><li>lein self-install </li></ul><ul><ul><li>leiningen インストール直後に一回だけ行う (windows 版は大変! ) </li></ul></ul><ul><li>lein new [project name] </li></ul><ul><ul><li>プロジェクト作成。 project.clj( プロジェクト設定マクロ ) 、スケルトンファイル生成 </li></ul></ul><ul><li>lein deps </li></ul><ul><ul><li>project.clj に記述した依存ライブラリ取得 (clojure 本体 /contrib もここで取得可能 ) </li></ul></ul><ul><li>lein repl </li></ul><ul><ul><li>project.clj に記述した依存ライブラリをクラスパスに入れた状態で REPL 起動 </li></ul></ul><ul><li>lein test </li></ul><ul><ul><li>テストコード実行 </li></ul></ul><ul><li>lein compile </li></ul><ul><ul><li>clj ファイルを class ファイル (java バイトコード ) にコンパイル </li></ul></ul><ul><li>lein jar </li></ul><ul><ul><li>プロジェクトで生成した class ファイルをまとめて java アーカイブ (jar) を作成 </li></ul></ul><ul><li>lein uberjar </li></ul><ul><ul><li>依存ライブラリを含めた jar を作成 </li></ul></ul><ul><li>lein swank </li></ul><ul><ul><li>swank server を立ち上げる。別途プラグインが必要 </li></ul></ul><ul><li>その他 http://bit.ly/96A9ia 参考 </li></ul>
  8. 8. マクロで Mapper/Reducer 定義 <ul><li>Mapper/Reduce クラス定義のような定型的な箇所はマクロでテンプレート化。 </li></ul><ul><li>http://github.com/making/cloudure </li></ul><ul><li>で改良中 </li></ul>(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))))))
  9. 9. 簡単並行処理 <ul><li>map の代わりに pmap を使うと並行処理になる(ただし低コストな処理の場合はかえってスレッド生成のオーバヘッドのほうが大きい) </li></ul><ul><li>pmap/reduce!( 違 ) </li></ul><ul><ul><li>実際 map 関数を使うのは reducer 内だと思うので、、、 </li></ul></ul>
  10. 10. マルチメソッドを使う <ul><li>int -> IntWritable とか </li></ul><ul><li>double -> DoubleWritable とか </li></ul><ul><li>String -> Text </li></ul><ul><li>に変換して Context に設定するのが面倒くさい->マルチメソッドでディスパッチ! </li></ul><ul><li>Mapper/Reducer の返り値が [key value] な vector である場合にそれぞれディスパッチするようなマクロにする </li></ul><ul><li>パフォーマンスはいまいちかも? </li></ul>

×