BigData avec Incanter et Clojure                             JUG Summer Camp 2012                           Claude Falguiè...
AU PROGRAMME  Lire et                                Stocker les  explorer                Construire     données       Gén...
VOTRE MISSION SI VOUS                        L’ACCEPTEZ ...                          rapports d’analyse de tests de perfor...
INCANTER                          =       +                                      Math,                                    ...
INCANTER                                        DSL                          manipulation de matrices et tables           ...
INCANTER                                  Ecosystème Java                                       Netlib                    ...
CLAUDE FALGUIERE                                               goo.gl/4mmJQ                                        http://...
ET VOUS ?                          ?      ?        ? JUG Summer Camp 2012             8       Claude Falguierejeudi 13 sep...
Petit rappel        Clojure JUG Summer Camp 2012     9   Claude Falguierejeudi 13 septembre 2012                          9
HELLO WORLD         (println "Hello JUG Summer Camp")                             -> "Hello JUG Summer Camp"          (def...
LES NOMBRES                          (+ 1 2 3)        -> 7                          (+ 4 (* 2 3))    -> 10                ...
Lire et     explorer     des données JUG Summer Camp 2012     12   Claude Falguierejeudi 13 septembre 2012                ...
SE LANCER                             La voie du novice                 1) downloader Incanter                            ...
LES EXEMPLES                              https://github.com/cfalguiere/                          ClojureBigDataJugSummerC...
PREMIER SCRIPT JUG Summer Camp 2012           15         Claude Falguierejeudi 13 septembre 2012                          ...
LIRE DES DONNÉES      (use (incanter core io stats charts))      (def ds        (read-dataset "readings.csv" :header true)...
LES COLLECTIONS                               Clojure                                 ,             (def colors ["red" "ma...
LES COLLECTIONS                               Incanter                   Matrix                   Dataset JUG Summer Camp ...
LES MAPS                                     Clojure                          (def conf                             {:name...
JEU DE DONNÉES        t                 lb           ts             s   rc shop srch        userId ...     754 "SU01-HomeP...
LES COLONNES                          user>($ :t ds)             user> (mean ($ :t ds))                                994...
QUANTILE 95%          (quantile ($ :t ds) :probs [0.95])             911.1758241758242                          Temps maxi...
LES COLONNES   (view ($ [:lb :t :shop] ds )) ->                              ) JUG Summer Camp 2012          23        Cla...
LES LIGNES                           ($where {:s "true"} ds)                                         -> les lignes OK JUG ...
LES LIGNES              ($where {:s "true"                       :shop {:$in #{"MAF", "FAB"}}                       :t {:$...
WITH-DATA            (with-data ds                                                      ds                    (view ($ :t ...
INCANTER CHARTS                                             Time-series            Scatter Plot                           ...
(view (time-series-plot :ts :t :data ds)                                           ds                                     ...
(doto     (time-series-plot :ts :t :data ds :title "Readings"                           :x-label "time" :y-label "resp. ti...
DOTO             (doto (time-series-plot :ts :t :data ds :title "Readings"                    (time-series-plot :ts :t :da...
REGROUPEMENT             (def groups ($group-by :shop ds))                   {             "MAF"                          ...
LIRE UN GROUPE                      (get groups {:shop "MAF"}) JUG Summer Camp 2012                   32         Claude Fa...
$ROLLUP              user> ($rollup count :t :shop ds)              [:shop :t]     fonction regroupement              ["MS...
MOYENNE                          Moyenne par groupe           user> ($rollup mean :t :lb ds)       [:lb :t]       ["SU61-B...
DIAGRAMMES EN BARRES       user>(view (bar-chart                   :shop                   :t                   :vertical ...
ENREGISTRER LES CHARTS          (save (histogram :t :data ds) "histogram.png") JUG Summer Camp 2012             36        ...
REJOUER LE SCRIPT     (use (incanter core io stats charts))     (def ds (read-dataset "../data/readings.csv" :header true)...
ET ENSUITE ...            Les limitations du REPL seul            - difficile d’écrire des commandes complexes            -...
Construire   un projet Clojure JUG Summer Camp 2012     39   Claude Falguierejeudi 13 septembre 2012                      ...
L’ECOSYSTEME CLOJURE                          build et gestion de dépendance                          lein (leiningen)    ...
L’ATELIER                               REPL + editeur de texte                          ou                               ...
SE LANCER                          La voie du gourou                          installer leiningen                         ...
NEW              demo                classes                lib                project.clj                src             ...
PROJECT.CLJ       (defproject demo "1.0.0-SNAPSHOT"         :description "demos incanter "                             inc...
DEPENDANCES                          Clojars     .m2                          Sonatype      repository                    ...
TEST UNITAIRES                                   clojure.test (built-in)                          (defn f1 [s]           (...
NAMESPACES              demo                                  (ns demo.core)               classes               lib      ...
RECHERCHER PAR DATE          (ns demo.utils            (:use [clj-time.core :only date-time]) )          user> (let [ star...
TEST TIME      (deftest test-readable-timestamp         (let [ ds (dataset                        [:ts]                   ...
MAPPER UNE COLONNE                          ($map   fct-to-date   :ts ds ) JUG Summer Camp 2012              50           ...
CLJ-TIME (JODA)       (ns demo.utils         (:require [clj-time.coerce :as coerce]) )                             (coerce...
MAPPER UNE COLONNE                                                     arg                          ($map #(coerce/from-lo...
AUGMENTER LE DATASET          (defn readable-timestamp [ds]           (conj-cols ds                (dataset [:timestamp]  ...
LEIN TEST             >lein test             Testing loaderdemo.test.jmeterloader             Ran 3 tests containing 5 ass...
SCRIPT                demo/core.clj      (ns demo.core        :use [[incanter.core]              [demo.utils]] ;; readable...
MAIN                demo/core.clj      (ns demo.core        :use [[incanter.core]              [demo.utils]] ;; readable-t...
LEIN RUN     (defproject demo "1.0.0-SNAPSHOT"       :description "demos incanter"       :dependencies ...       :dev-depe...
LEIN REPL     lein repl     REPL started; server listening on localhost port 61426     demo.core=> JUG Summer Camp 2012   ...
LES GRIMOIRES                                   incanter.org                                data-sorcery.org              ...
Stocker    les données JUG Summer Camp 2012     60   Claude Falguierejeudi 13 septembre 2012                           60
ARCHITECTURE          Document                           Incanter.mongodb                                              Mon...
SE CONNECTER        (ns dm          (:require [somnium.congomongo :as cm]               [incanter.core :as incanter]      ...
MASS INSERT          (cm/with-mongo conn                (im/insert-dataset :readings ds))                                 ...
DANS MONGO       mongo       connecting to: test       > show dbs       demodb	 0.203125GB       local	 (empty)       db.r...
LIRE     (im/fetch-dataset :readings ))      (cm/fetch :readings                    :where {:shop "MAF"} )       ({:ts "13...
JDBC                          pas d’intégration Incanter JDBC                               des librairies Clojure        ...
Générer   un rapport HTML JUG Summer Camp 2012     67   Claude Falguierejeudi 13 septembre 2012                           67
LE WEB ET CLOJURE                              Enlive ou Hiccup                           Moustache ou Compojure          ...
LE RAPPORT JUG Summer Camp 2012         69       Claude Falguierejeudi 13 septembre 2012                                  ...
HICCUP                 (ns hiccupdemo.core                   (:use hiccup.core)                   (:use hiccup.page)      ...
FORMATER LA TABLE                    (defn build-table [{:keys [rows]}]                       (html [:table               ...
FORMATER LA LIGNE         (defn table-row [{:keys                           [lb count mean min max q95]}]           (html ...
DESTRUCTURING                                  DE MAP                                            user=> (keys statsds)    ...
DESTRUCTURING                                  DE MAP                                            user=> (keys statsds)    ...
45350 relevés                          "Elapsed time: 24940.557 msecs" => loader                          "Elapsed time: 2...
OPTIONS JVM            lein run            Exception in thread "AWT-Shutdown"            java.lang.OutOfMemoryError: Java ...
PERFORMANCE                                         Console                           surtout ne listez pas les données :o...
Faire un job  MapReduce Hadoop JUG Summer Camp 2012     78   Claude Falguierejeudi 13 septembre 2012                      ...
MAP REDUCE JUG Summer Camp 2012         79       Claude Falguierejeudi 13 septembre 2012                                  ...
CLOJURE-HADOOP                :input-format source format             input                            :map-reader fn     ...
JUG Summer Camp 2012     81   Claude Falguierejeudi 13 septembre 2012                           81
MAP   (defn csv-line-parser [line]      (map #(.trim %) (first (csv/parse-csv line))))       ;; require clojure-csv   (def...
JUG Summer Camp 2012     83   Claude Falguierejeudi 13 septembre 2012                           83
REDUCE     (defn my-reduce [key values-fn]         [[(str key ":count") (count values-fn)]          [(str key ":mean") (st...
LEIN JAR                          lein jar                          et installer déployer dans hadoop JUG Summer Camp 2012...
CASCALOG                             Cascading + Datalog + Clojure                               Dites, vous aimez Prolog ...
LES ÉCOLES DE MAGIE                                   4clojure.com                                      labrepl           ...
CLAUDE FALGUIERE                          @cfalguiere                          goo.gl/4mmJQ        Merci JUG Summer Camp 2...
Prochain SlideShare
Chargement dans…5
×

Incanter bigdata jsc2012

3 466 vues

Publié le

Présentation BigData avec Incanter et Clojure au JUG Summer Camp 2012.
La version video des slides est sur YouTube http://youtu.be/a5aUrGOWPK0

Publié dans : Technologie, Spirituel
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 466
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 733
Actions
Partages
0
Téléchargements
24
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Incanter bigdata jsc2012

  1. 1. BigData avec Incanter et Clojure JUG Summer Camp 2012 Claude Falguière @cfalguiere goo.gl/4mmJQ 1jeudi 13 septembre 2012 1
  2. 2. AU PROGRAMME Lire et Stocker les explorer Construire données Générer Faire un job des un projet dans un rapport MapReduce données Clojure MongoDB HTML Hadoop avec Clojure JUG Summer Camp 2012 2 Claude Falguierejeudi 13 septembre 2012 2
  3. 3. VOTRE MISSION SI VOUS L’ACCEPTEZ ... rapports d’analyse de tests de performance 500 utilisateurs x 5h de test environ 1 000 000 relevés filtrage des erreurs transformer les données regrouper par catégories charts, distributions, corrélations JUG Summer Camp 2012 3 Claude Falguierejeudi 13 septembre 2012 3
  4. 4. INCANTER = + Math, Stats, Graps JUG Summer Camp 2012 4 Claude Falguierejeudi 13 septembre 2012 4
  5. 5. INCANTER DSL manipulation de matrices et tables statistiques charts modèles test d’hypothèse JUG Summer Camp 2012 5 Claude Falguierejeudi 13 septembre 2012 5
  6. 6. INCANTER Ecosystème Java Netlib Parallel Colt JFreeChart Motivation pour se mettre à Clojure Langage Fonctionnel JUG Summer Camp 2012 6 Claude Falguierejeudi 13 septembre 2012 6
  7. 7. CLAUDE FALGUIERE goo.gl/4mmJQ http://cfalguiere.wordpress.com @cfalguiere JUG Summer Camp 2012 7 Claude Falguierejeudi 13 septembre 2012 7
  8. 8. ET VOUS ? ? ? ? JUG Summer Camp 2012 8 Claude Falguierejeudi 13 septembre 2012 8
  9. 9. Petit rappel Clojure JUG Summer Camp 2012 9 Claude Falguierejeudi 13 septembre 2012 9
  10. 10. HELLO WORLD (println "Hello JUG Summer Camp") -> "Hello JUG Summer Camp" (def conference "JUG Summer Camps") (println "Hello" conference) (count (str "Hello" conference)) JUG Summer Camp 2012 10 Claude Falguierejeudi 13 septembre 2012 10
  11. 11. LES NOMBRES (+ 1 2 3) -> 7 (+ 4 (* 2 3)) -> 10 (= 2 (+ 1 1)) -> true JUG Summer Camp 2012 11 Claude Falguierejeudi 13 septembre 2012 11
  12. 12. Lire et explorer des données JUG Summer Camp 2012 12 Claude Falguierejeudi 13 septembre 2012 12
  13. 13. SE LANCER La voie du novice 1) downloader Incanter 2) lancer le REPL JUG Summer Camp 2012 13 Claude Falguierejeudi 13 septembre 2012 13
  14. 14. LES EXEMPLES https://github.com/cfalguiere/ ClojureBigDataJugSummerCamp2012 JUG Summer Camp 2012 14 Claude Falguierejeudi 13 septembre 2012 14
  15. 15. PREMIER SCRIPT JUG Summer Camp 2012 15 Claude Falguierejeudi 13 septembre 2012 15
  16. 16. LIRE DES DONNÉES (use (incanter core io stats charts)) (def ds (read-dataset "readings.csv" :header true)) équivalent pour Excel (save ds "./data.csv") JUG Summer Camp 2012 16 Claude Falguierejeudi 13 septembre 2012 16
  17. 17. LES COLLECTIONS Clojure , (def colors ["red" "magenta" "orange"]) (def colors ‘("red" "magenta" "orange")) (def colors #{"red" "magenta" "orange"}) JUG Summer Camp 2012 17 Claude Falguierejeudi 13 septembre 2012 17
  18. 18. LES COLLECTIONS Incanter Matrix Dataset JUG Summer Camp 2012 18 Claude Falguierejeudi 13 septembre 2012 18
  19. 19. LES MAPS Clojure (def conf {:name "JUG Summer Camp", :location "La Rochelle" }) JUG Summer Camp 2012 19 Claude Falguierejeudi 13 septembre 2012 19
  20. 20. JEU DE DONNÉES t lb ts s rc shop srch userId ... 754 "SU01-HomePage-Page" 1330419301862 "true" 200 "MAF" "gants" "PT1022809551" JUG Summer Camp 2012 20 Claude Falguierejeudi 13 septembre 2012 20
  21. 21. LES COLONNES user>($ :t ds) user> (mean ($ :t ds)) 994,75 JUG Summer Camp 2012 21 Claude Falguierejeudi 13 septembre 2012 21
  22. 22. QUANTILE 95% (quantile ($ :t ds) :probs [0.95]) 911.1758241758242 Temps maximum pour 95% des relevés JUG Summer Camp 2012 22 Claude Falguierejeudi 13 septembre 2012 22
  23. 23. LES COLONNES (view ($ [:lb :t :shop] ds )) -> ) JUG Summer Camp 2012 23 Claude Falguierejeudi 13 septembre 2012 23
  24. 24. LES LIGNES ($where {:s "true"} ds) -> les lignes OK JUG Summer Camp 2012 24 Claude Falguierejeudi 13 septembre 2012 24
  25. 25. LES LIGNES ($where {:s "true" :shop {:$in #{"MAF", "FAB"}} :t {:$gt 3000 :$lt 5000}} ds) JUG Summer Camp 2012 25 Claude Falguierejeudi 13 septembre 2012 25
  26. 26. WITH-DATA (with-data ds ds (view ($ :t ($where {:shop "MAF"} )))) ds))) ds)) ds) JUG Summer Camp 2012 26 Claude Falguierejeudi 13 septembre 2012 26
  27. 27. INCANTER CHARTS Time-series Scatter Plot Bar charts Histograms Box Plot JUG Summer Camp 2012 27 Claude Falguierejeudi 13 septembre 2012 27
  28. 28. (view (time-series-plot :ts :t :data ds) ds ds)) :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms")) JUG Summer Camp 2012 Claude Falguierejeudi 13 septembre 2012 28
  29. 29. (doto (time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0) (set-stroke :width 1 :series 0) (set-stroke-color java.awt.Color/red :series 1) (set-stroke :width 3 :series 1) view) JUG Summer Camp 2012 29 Claude Falguierejeudi 13 septembre 2012 29
  30. 30. DOTO (doto (time-series-plot :ts :t :data ds :title "Readings" (time-series-plot :ts :t :data ds :title "Readings" :x-label "time" :y-label "resp. time (ms)" :legend true :series-label "duration ms" ) (add-lines ts (repeat 3000) :series-label "threshold") (set-stroke-color java.awt.Color/blue :series 0) view view) (view (set-stroke-color (set-stroke-color (add-lines (add-lines (add-lines (time-series-plot... (time-series-plot... (time-series-plot... JUG Summer Camp 2012 30 Claude Falguierejeudi 13 septembre 2012 30
  31. 31. REGROUPEMENT (def groups ($group-by :shop ds)) { "MAF" {:shop "MAF"} "FAB" {:shop "FAB"} }} JUG Summer Camp 2012 31 Claude Falguierejeudi 13 septembre 2012 31
  32. 32. LIRE UN GROUPE (get groups {:shop "MAF"}) JUG Summer Camp 2012 32 Claude Falguierejeudi 13 septembre 2012 32
  33. 33. $ROLLUP user> ($rollup count :t :shop ds) [:shop :t] fonction regroupement ["MSK" 170] ["KIE" 76] ["OIB" 342] ["FAB" 171] ... Applique une fonction à chaque entrée d’un $group-by JUG Summer Camp 2012 33 Claude Falguierejeudi 13 septembre 2012 33
  34. 34. MOYENNE Moyenne par groupe user> ($rollup mean :t :lb ds) [:lb :t] ["SU61-BrowseCat2-Page" 911.1758241758242] ["SU43-Paiment-Page" 1770.6004566210045] ["SU42-DeliveryAndBilling-Page" 732.0340136054422] ["SU41-CustomerDetails-Page" 608.2222222222222] ... JUG Summer Camp 2012 34 Claude Falguierejeudi 13 septembre 2012 34
  35. 35. DIAGRAMMES EN BARRES user>(view (bar-chart :shop :t :vertical false :data ($rollup count :t :shop ds) ($rollup count :t :shop ds))) JUG Summer Camp 2012 35 Claude Falguierejeudi 13 septembre 2012 35
  36. 36. ENREGISTRER LES CHARTS (save (histogram :t :data ds) "histogram.png") JUG Summer Camp 2012 36 Claude Falguierejeudi 13 septembre 2012 36
  37. 37. REJOUER LE SCRIPT (use (incanter core io stats charts)) (def ds (read-dataset "../data/readings.csv" :header true) ) (save (histogram :ts :t :data ds) "histogram.png") (println ($rollup mean :t :lb ds)) analyse.clj user>(load-file "analyse.clj") JUG Summer Camp 2012 37 Claude Falguierejeudi 13 septembre 2012 37
  38. 38. ET ENSUITE ... Les limitations du REPL seul - difficile d’écrire des commandes complexes - pas de tests unitaires - que les libs fournies dans l’uberjar incanter lein ... JUG Summer Camp 2012 38 Claude Falguierejeudi 13 septembre 2012 38
  39. 39. Construire un projet Clojure JUG Summer Camp 2012 39 Claude Falguierejeudi 13 septembre 2012 39
  40. 40. L’ECOSYSTEME CLOJURE build et gestion de dépendance lein (leiningen) repos Maven clojars, sonatype tests unitaires clojure.test (built-in), midge intégration avec les IDE swank, jark JUG Summer Camp 2012 40 Claude Falguierejeudi 13 septembre 2012 40
  41. 41. L’ATELIER REPL + editeur de texte ou Emacs + Slime + Swank Eclipse + CounterClockWise IDEA + La Clojure + Leiningen Netbeans + Enclojure Vim + VimClojure JUG Summer Camp 2012 41 Claude Falguierejeudi 13 septembre 2012 41
  42. 42. SE LANCER La voie du gourou installer leiningen lein new myproject configurer project.clj lein <task> JUG Summer Camp 2012 42 Claude Falguierejeudi 13 septembre 2012 42
  43. 43. NEW demo classes lib project.clj src demo core.clj test demo test core.clj JUG Summer Camp 2012 43 Claude Falguierejeudi 13 septembre 2012 43
  44. 44. PROJECT.CLJ (defproject demo "1.0.0-SNAPSHOT" :description "demos incanter " incanter" :dependencies [[org.clojure/clojure "1.3.0"] [incanter "1.3.0"] ] ) :dev-dependencies [[swank-clojure "1.4.2"]]) JUG Summer Camp 2012 44 Claude Falguierejeudi 13 septembre 2012 44
  45. 45. DEPENDANCES Clojars .m2 Sonatype repository incanter incanter 1.3.0 incanter-1.3.0.jar >lein deps demo myproject classes lib incanter-1.3.0.jar project.clj JUG Summer Camp 2012 45 Claude Falguierejeudi 13 septembre 2012 45
  46. 46. TEST UNITAIRES clojure.test (built-in) (defn f1 [s] (deftest test-f1 (* 2 s)) (is 6 (f1 3))) JUG Summer Camp 2012 46 Claude Falguierejeudi 13 septembre 2012 46
  47. 47. NAMESPACES demo (ns demo.core) classes lib (defn f1 [s] project.clj (* 2 s)) src demo core.clj (ns demo.test.core test (:use demo.core) demo (:use clojure.test)) test core.clj (deftest test-f1 (is 6 (f1 3))) JUG Summer Camp 2012 47 Claude Falguierejeudi 13 septembre 2012 47
  48. 48. RECHERCHER PAR DATE (ns demo.utils (:use [clj-time.core :only date-time]) ) user> (let [ start-time{:timestamp {:$gt02 28 8 55) (view ($where (date-time 2012 start-time end-time (date-time 2012 02 end-time}} end-time ] :$lt 28 8 57) ] ds)) (view ($where {:timestamp {:$gt start-time :$lt end-time}} ds))) JUG Summer Camp 2012 48 Claude Falguierejeudi 13 septembre 2012 48
  49. 49. TEST TIME (deftest test-readable-timestamp (let [ ds (dataset [:ts] [{:ts 1330418007548} {:ts 1330418007549}]) result (readable-timestamp ds) ] (is (= 2012 ) (year (sel result adate ))) :rows 0 :cols :timestamp )))) )) ) JUG Summer Camp 2012 49 Claude Falguierejeudi 13 septembre 2012 49
  50. 50. MAPPER UNE COLONNE ($map fct-to-date :ts ds ) JUG Summer Camp 2012 50 Claude Falguierejeudi 13 septembre 2012 50
  51. 51. CLJ-TIME (JODA) (ns demo.utils (:require [clj-time.coerce :as coerce]) ) (coerce/from-long 1330418007548) #<Date Tue Feb 28 09:33:27 CET 2012> JUG Summer Camp 2012 51 Claude Falguierejeudi 13 septembre 2012 51
  52. 52. MAPPER UNE COLONNE arg ($map #(coerce/from-long %):ts ds )) :ts ds fonction anonyme JUG Summer Camp 2012 52 Claude Falguierejeudi 13 septembre 2012 52
  53. 53. AUGMENTER LE DATASET (defn readable-timestamp [ds] (conj-cols ds (dataset [:timestamp] ($map #(coerce/from-long %) :ts ds ) ($map #(coerce/from-long %) :ts ds )) )))) ))) JUG Summer Camp 2012 53 Claude Falguierejeudi 13 septembre 2012 53
  54. 54. LEIN TEST >lein test Testing loaderdemo.test.jmeterloader Ran 3 tests containing 5 assertions. 0 failures, 0 errors. Testing loaderdemo.test.xmlloader Ran 5 tests containing 13 assertions. 0 failures, 0 errors. Testing loaderdemo.test.core Testing loaderdemo.test.jmeterloader Testing loaderdemo.test.xmlloader Ran 9 tests containing 19 assertions. 0 failures, 0 errors. JUG Summer Camp 2012 54 Claude Falguierejeudi 13 septembre 2012 54
  55. 55. SCRIPT demo/core.clj (ns demo.core :use [[incanter.core] [demo.utils]] ;; readable-timestamp :require [[incanter.io :as io] [incanter.stats :as stats] [incanter.charts :as charts]]) (let [ds (readable-timestamp(io/read-dataset "readings.csv"))] (save (charts/time-series-plot :ts :t :data ds) "times.png") (println ($rollup mean :t :lb ds))) JUG Summer Camp 2012 55 Claude Falguierejeudi 13 septembre 2012 55
  56. 56. MAIN demo/core.clj (ns demo.core :use [[incanter.core] [demo.utils]] ;; readable-timestamp :require [[incanter.io :as io] [incanter.stats :as stats] [incanter.charts :as charts]]) (defn -main [& args] (let [ds (readable-timestamp(io/read-dataset "readings.csv"))] (save (charts/time-series-plot :ts :t :data ds) "times.png") (println ($rollup mean :t :lb ds))) lein run No :main namespace specified in project.clj. JUG Summer Camp 2012 56 Claude Falguierejeudi 13 septembre 2012 56
  57. 57. LEIN RUN (defproject demo "1.0.0-SNAPSHOT" :description "demos incanter" :dependencies ... :dev-dependencies ... :main demo.core) lein run read 1738 JUG Summer Camp 2012 57 Claude Falguierejeudi 13 septembre 2012 57
  58. 58. LEIN REPL lein repl REPL started; server listening on localhost port 61426 demo.core=> JUG Summer Camp 2012 58 Claude Falguierejeudi 13 septembre 2012 58
  59. 59. LES GRIMOIRES incanter.org data-sorcery.org github.com/liebke/incanter Incanter sur Stackoverflow Incanter Google Group JUG Summer Camp 2012 59 Claude Falguierejeudi 13 septembre 2012 59
  60. 60. Stocker les données JUG Summer Camp 2012 60 Claude Falguierejeudi 13 septembre 2012 60
  61. 61. ARCHITECTURE Document Incanter.mongodb MongoDB CongoMongo Server Clojure JUG Summer Camp 2012 61 Claude Falguierejeudi 13 septembre 2012 61
  62. 62. SE CONNECTER (ns dm (:require [somnium.congomongo :as cm] [incanter.core :as incanter] [incanter.mongodb :as im])) (def conn (cm/make-connection :demodb)) #demomongo/conn JUG Summer Camp 2012 62 Claude Falguierejeudi 13 septembre 2012 62
  63. 63. MASS INSERT (cm/with-mongo conn (im/insert-dataset :readings ds)) ds) ({:ts "1330419301862", :search__phrase "gants", :userId "PT1022809551", ... JUG Summer Camp 2012 63 Claude Falguierejeudi 13 septembre 2012 63
  64. 64. DANS MONGO mongo connecting to: test > show dbs demodb 0.203125GB local (empty) db.readings.find( {lb:SU12b-PickProduct-Page, shop:MAF, search__phrase:‘gants’} ) { "_id" : ObjectId("5034e71703643050fef59474"), "ts" : "1330419324275", "search__phrase" : "gants", "userId" : "PT1022809551", "hrts" : "2012-02-28T08:55:24.275Z", "rc" : NumberLong(200), "productId" : "8519304225180894762", "shop" : "MAF", "lb" : "SU12b-PickProduct-Page", "t" : NumberLong(1177), "s" : "true" } ... JUG Summer Camp 2012 64 Claude Falguierejeudi 13 septembre 2012 64
  65. 65. LIRE (im/fetch-dataset :readings )) (cm/fetch :readings :where {:shop "MAF"} ) ({:ts "1330419301862", :search__phrase "gants", :userId "PT1022809551", :hrts "2012-02-28T08:55:01.862Z", ... JUG Summer Camp 2012 65 Claude Falguierejeudi 13 septembre 2012 65
  66. 66. JDBC pas d’intégration Incanter JDBC des librairies Clojure clojure.java.jdbc Korma ClojureQL JUG Summer Camp 2012 66 Claude Falguierejeudi 13 septembre 2012 66
  67. 67. Générer un rapport HTML JUG Summer Camp 2012 67 Claude Falguierejeudi 13 septembre 2012 67
  68. 68. LE WEB ET CLOJURE Enlive ou Hiccup Moustache ou Compojure Ring JUG Summer Camp 2012 68 Claude Falguierejeudi 13 septembre 2012 68
  69. 69. LE RAPPORT JUG Summer Camp 2012 69 Claude Falguierejeudi 13 septembre 2012 69
  70. 70. HICCUP (ns hiccupdemo.core (:use hiccup.core) (:use hiccup.page) (:use hiccup.element) JUG Summer Camp 2012 70 Claude Falguierejeudi 13 septembre 2012 70
  71. 71. FORMATER LA TABLE (defn build-table [{:keys [rows]}] (html [:table (table-headers) (map table-row rows) ])) )) JUG Summer Camp 2012 71 Claude Falguierejeudi 13 septembre 2012 71
  72. 72. FORMATER LA LIGNE (defn table-row [{:keys [lb count mean min max q95]}] (html [:tr [:td lb] [:td {:class "number"} count] [:td {:class "number"} mean ] (format "%6.2f" mean)] ... ]])) JUG Summer Camp 2012 72 Claude Falguierejeudi 13 septembre 2012 72
  73. 73. DESTRUCTURING DE MAP user=> (keys statsds) (:column-names :rows) (defn build-table [statsds] (html [:table (table-headers) (map table-row (:rows statsds)) ])) JUG Summer Camp 2012 73 Claude Falguierejeudi 13 septembre 2012 73
  74. 74. DESTRUCTURING DE MAP user=> (keys statsds) (:column-names :rows) (defn build-table [{:keys [rows]}] (html [:table (table-headers) (map table-row rows) ])) JUG Summer Camp 2012 74 Claude Falguierejeudi 13 septembre 2012 74
  75. 75. 45350 relevés "Elapsed time: 24940.557 msecs" => loader "Elapsed time: 24542.737 msecs" => 1er chart "Elapsed time: 3042.975 msecs" => 2eme chart "Elapsed time: 24317.2 msecs" => stats "Elapsed time: 122.479 msecs" => rapport JUG Summer Camp 2012 75 Claude Falguierejeudi 13 septembre 2012 75
  76. 76. OPTIONS JVM lein run Exception in thread "AWT-Shutdown" java.lang.OutOfMemoryError: Java heap space ! at java.util.IdentityHashMap$Values.iterator (IdentityHashMap.java:1009) ! at java.util.Collections $SynchronizedCollection.iterator(Collections.java:1573) project.clj :main perfdemo.core :jvm-opts ["-Xmx1g"] ) JUG Summer Camp 2012 76 Claude Falguierejeudi 13 septembre 2012 76
  77. 77. PERFORMANCE Console surtout ne listez pas les données :o Mémoire données accumulées dans le dataset IO Disque si beaucoup de graphes à sauver sur disque JUG Summer Camp 2012 77 Claude Falguierejeudi 13 septembre 2012 77
  78. 78. Faire un job MapReduce Hadoop JUG Summer Camp 2012 78 Claude Falguierejeudi 13 septembre 2012 78
  79. 79. MAP REDUCE JUG Summer Camp 2012 79 Claude Falguierejeudi 13 septembre 2012 79
  80. 80. CLOJURE-HADOOP :input-format source format input :map-reader fn :map fn :reduce fn (defjob/defjob job :map my-map output :map-reader wrap/int-string-map-reader :reduce my-reduce :input-format :text) JUG Summer Camp 2012 80 Claude Falguierejeudi 13 septembre 2012 80
  81. 81. JUG Summer Camp 2012 81 Claude Falguierejeudi 13 septembre 2012 81
  82. 82. MAP (defn csv-line-parser [line] (map #(.trim %) (first (csv/parse-csv line)))) ;; require clojure-csv (defn my-map [key line] (cond (= key 0) [] :else (let [ )) ... cells (csv-line-parser line) t (nth cells 0) (Long/parseLong (nth cells 0)) [lb, shop] (map #(nth cells %) [1,6])] ] ] [["all" t] [(str "lb:" lb) t] [ lb t] [(str t]] ))) [ shop"shop:" shop) t]] ))) JUG Summer Camp 2012 82 Claude Falguierejeudi 13 septembre 2012 82
  83. 83. JUG Summer Camp 2012 83 Claude Falguierejeudi 13 septembre 2012 83
  84. 84. REDUCE (defn my-reduce [key values-fn] [[(str key ":count") (count values-fn)] [(str key ":mean") (stats/mean values-fn)]]) JUG Summer Camp 2012 84 Claude Falguierejeudi 13 septembre 2012 84
  85. 85. LEIN JAR lein jar et installer déployer dans hadoop JUG Summer Camp 2012 85 Claude Falguierejeudi 13 septembre 2012 85
  86. 86. CASCALOG Cascading + Datalog + Clojure Dites, vous aimez Prolog ? user=> (?<- (stdout) [?person ?age] (age ?person ?age) (< ?age 30)) JUG Summer Camp 2012 86 Claude Falguierejeudi 13 septembre 2012 86
  87. 87. LES ÉCOLES DE MAGIE 4clojure.com labrepl Clojure sur Stackoverflow Paris Clojure User Group http://dev.clojure.org/display/community/Clojure+User+Groups JUG Summer Camp 2012 87 Claude Falguierejeudi 13 septembre 2012 87
  88. 88. CLAUDE FALGUIERE @cfalguiere goo.gl/4mmJQ Merci JUG Summer Camp 2012 88 Claude Falguierejeudi 13 septembre 2012 88

×