SlideShare una empresa de Scribd logo
1 de 88
Descargar para leer sin conexión
BigData avec Incanter et Clojure
                             JUG Summer Camp 2012

                           Claude Falguière @cfalguiere


                                              goo.gl/4mmJQ
                                         1
jeudi 13 septembre 2012                                      1
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 Falguiere
jeudi 13 septembre 2012                                                                2
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 Falguiere
jeudi 13 septembre 2012                                                                3
INCANTER



                          =       +
                                      Math,
                                      Stats,
                                      Graps

 JUG Summer Camp 2012         4       Claude Falguiere
jeudi 13 septembre 2012                                  4
INCANTER
                                        DSL

                          manipulation de matrices et tables

                                     statistiques
                                        charts
                                      modèles
                                  test d’hypothèse


 JUG Summer Camp 2012                     5                    Claude Falguiere
jeudi 13 septembre 2012                                                           5
INCANTER
                                  Ecosystème Java
                                       Netlib
                                    Parallel Colt
                                    JFreeChart

                          Motivation pour se mettre à Clojure
                                  Langage Fonctionnel



 JUG Summer Camp 2012                     6                 Claude Falguiere
jeudi 13 septembre 2012                                                        6
CLAUDE FALGUIERE


                                               goo.gl/4mmJQ


                                        http://cfalguiere.wordpress.com
                          @cfalguiere




 JUG Summer Camp 2012                      7                    Claude Falguiere
jeudi 13 septembre 2012                                                            7
ET VOUS ?




                          ?      ?        ?
 JUG Summer Camp 2012             8       Claude Falguiere
jeudi 13 septembre 2012                                      8
Petit rappel
        Clojure



 JUG Summer Camp 2012     9   Claude Falguiere
jeudi 13 septembre 2012                          9
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 Falguiere
jeudi 13 septembre 2012                                            10
LES NOMBRES

                          (+ 1 2 3)        -> 7
                          (+ 4 (* 2 3))    -> 10

                          (= 2 (+ 1 1))    -> true




 JUG Summer Camp 2012                 11             Claude Falguiere
jeudi 13 septembre 2012                                                 11
Lire et
     explorer
     des données
 JUG Summer Camp 2012     12   Claude Falguiere
jeudi 13 septembre 2012                           12
SE LANCER
                             La voie du novice



                 1) downloader Incanter
                                               2) lancer le REPL




 JUG Summer Camp 2012                     13                 Claude Falguiere
jeudi 13 septembre 2012                                                         13
LES EXEMPLES
                              https://github.com/cfalguiere/
                          ClojureBigDataJugSummerCamp2012




 JUG Summer Camp 2012                    14                    Claude Falguiere
jeudi 13 septembre 2012                                                           14
PREMIER SCRIPT




 JUG Summer Camp 2012           15         Claude Falguiere
jeudi 13 septembre 2012                                       15
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 Falguiere
jeudi 13 septembre 2012                                              16
LES COLLECTIONS
                               Clojure


                                 ,
             (def colors ["red" "magenta" "orange"])




             (def colors ‘("red" "magenta" "orange"))



             (def colors #{"red" "magenta" "orange"})


 JUG Summer Camp 2012                17        Claude Falguiere
jeudi 13 septembre 2012                                           17
LES COLLECTIONS
                               Incanter



                   Matrix
                   Dataset




 JUG Summer Camp 2012            18         Claude Falguiere
jeudi 13 septembre 2012                                        18
LES MAPS
                                     Clojure

                          (def conf
                             {:name "JUG Summer Camp",
                              :location "La Rochelle" })




 JUG Summer Camp 2012                    19                Claude Falguiere
jeudi 13 septembre 2012                                                       19
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 Falguiere
jeudi 13 septembre 2012                                                                        20
LES COLONNES
                          user>($ :t ds)




             user> (mean ($ :t ds))
                                994,75

 JUG Summer Camp 2012                      21   Claude Falguiere
jeudi 13 septembre 2012                                            21
QUANTILE 95%


          (quantile ($ :t ds) :probs [0.95])
             911.1758241758242




                          Temps maximum pour 95% des relevés


 JUG Summer Camp 2012                      22                  Claude Falguiere
jeudi 13 septembre 2012                                                           22
LES COLONNES




   (view ($ [:lb :t :shop] ds )) ->
                              )




 JUG Summer Camp 2012          23        Claude Falguiere
jeudi 13 septembre 2012                                     23
LES LIGNES


                           ($where {:s "true"} ds)
                                         -> les lignes OK




 JUG Summer Camp 2012            24                 Claude Falguiere
jeudi 13 septembre 2012                                                24
LES LIGNES

              ($where {:s "true"
                       :shop {:$in #{"MAF", "FAB"}}
                       :t {:$gt 3000 :$lt 5000}} ds)




 JUG Summer Camp 2012              25                  Claude Falguiere
jeudi 13 septembre 2012                                                   25
WITH-DATA

            (with-data ds
                                                      ds
                    (view ($ :t ($where {:shop "MAF"} ))))
                                                      ds)))
                                                      ds))
                                                      ds)




 JUG Summer Camp 2012                  26                  Claude Falguiere
jeudi 13 septembre 2012                                                       26
INCANTER CHARTS
                                             Time-series
            Scatter Plot

                           Bar charts

    Histograms                                             Box Plot




 JUG Summer Camp 2012                   27                 Claude Falguiere
jeudi 13 septembre 2012                                                       27
(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 Falguiere
jeudi 13 septembre 2012                                                 28
(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 Falguiere
jeudi 13 septembre 2012                                                               29
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 Falguiere
jeudi 13 septembre 2012                                                            30
REGROUPEMENT

             (def groups ($group-by :shop ds))


                   {             "MAF"
                          {:shop "MAF"}               "FAB"
                                               {:shop "FAB"}               }}




 JUG Summer Camp 2012                     31                   Claude Falguiere
jeudi 13 septembre 2012                                                           31
LIRE UN GROUPE

                      (get groups {:shop "MAF"})




 JUG Summer Camp 2012                   32         Claude Falguiere
jeudi 13 septembre 2012                                               32
$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 Falguiere
jeudi 13 septembre 2012                                                 33
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 Falguiere
jeudi 13 septembre 2012                                            34
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 Falguiere
jeudi 13 septembre 2012                                             35
ENREGISTRER LES CHARTS


          (save (histogram :t :data ds) "histogram.png")




 JUG Summer Camp 2012             36                Claude Falguiere
jeudi 13 septembre 2012                                                36
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 Falguiere
jeudi 13 septembre 2012                                                        37
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 Falguiere
jeudi 13 septembre 2012                                                          38
Construire
   un projet Clojure
 JUG Summer Camp 2012     39   Claude Falguiere
jeudi 13 septembre 2012                           39
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 Falguiere
jeudi 13 septembre 2012                                                       40
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 Falguiere
jeudi 13 septembre 2012                                                           41
SE LANCER
                          La voie du gourou


                          installer leiningen
                          lein new myproject
                          configurer project.clj
                          lein <task>




 JUG Summer Camp 2012                   42        Claude Falguiere
jeudi 13 septembre 2012                                              42
NEW
              demo
                classes
                lib
                project.clj
                src
                   demo
                      core.clj
                test
                   demo
                     test
                       core.clj

 JUG Summer Camp 2012              43   Claude Falguiere
jeudi 13 septembre 2012                                    43
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 Falguiere
jeudi 13 septembre 2012                                            44
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 Falguiere
jeudi 13 septembre 2012                                                                 45
TEST UNITAIRES
                                   clojure.test (built-in)




                          (defn f1 [s]           (deftest test-f1
                            (* 2 s))               (is 6 (f1 3)))




 JUG Summer Camp 2012                       46                Claude Falguiere
jeudi 13 septembre 2012                                                          46
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 Falguiere
jeudi 13 septembre 2012                                                   47
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 Falguiere
jeudi 13 septembre 2012                                                            48
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 Falguiere
jeudi 13 septembre 2012                                               49
MAPPER UNE COLONNE



                          ($map   fct-to-date   :ts ds )




 JUG Summer Camp 2012              50             Claude Falguiere
jeudi 13 septembre 2012                                              50
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 Falguiere
jeudi 13 septembre 2012                                                         51
MAPPER UNE COLONNE

                                                     arg

                          ($map #(coerce/from-long %):ts ds ))
                                                      :ts ds

                                  fonction anonyme




 JUG Summer Camp 2012                52                Claude Falguiere
jeudi 13 septembre 2012                                                   52
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 Falguiere
jeudi 13 septembre 2012                                              53
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 Falguiere
jeudi 13 septembre 2012                                                 54
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 Falguiere
jeudi 13 septembre 2012                                                         55
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 Falguiere
jeudi 13 septembre 2012                                                            56
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 Falguiere
jeudi 13 septembre 2012                                        57
LEIN REPL

     lein repl
     REPL started; server listening on localhost port 61426
     demo.core=>




 JUG Summer Camp 2012               58                        Claude Falguiere
jeudi 13 septembre 2012                                                          58
LES GRIMOIRES
                                   incanter.org
                                data-sorcery.org
                           github.com/liebke/incanter


                           Incanter sur Stackoverflow
                             Incanter Google Group




 JUG Summer Camp 2012                 59                Claude Falguiere
jeudi 13 septembre 2012                                                    59
Stocker
    les données
 JUG Summer Camp 2012     60   Claude Falguiere
jeudi 13 septembre 2012                           60
ARCHITECTURE

          Document



                           Incanter.mongodb
                                              MongoDB
                             CongoMongo
                                               Server
                               Clojure


 JUG Summer Camp 2012              61          Claude Falguiere
jeudi 13 septembre 2012                                           61
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 Falguiere
jeudi 13 septembre 2012                                              62
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 Falguiere
jeudi 13 septembre 2012                                         63
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 Falguiere
jeudi 13 septembre 2012                                                                                     64
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 Falguiere
jeudi 13 septembre 2012                                         65
JDBC

                          pas d’intégration Incanter JDBC

                               des librairies Clojure
                                   clojure.java.jdbc
                                        Korma
                                      ClojureQL




 JUG Summer Camp 2012                     66                Claude Falguiere
jeudi 13 septembre 2012                                                        66
Générer
   un rapport HTML
 JUG Summer Camp 2012     67   Claude Falguiere
jeudi 13 septembre 2012                           67
LE WEB ET CLOJURE


                              Enlive ou Hiccup

                           Moustache ou Compojure

                                    Ring


 JUG Summer Camp 2012                  68           Claude Falguiere
jeudi 13 septembre 2012                                                68
LE RAPPORT




 JUG Summer Camp 2012         69       Claude Falguiere
jeudi 13 septembre 2012                                   69
HICCUP
                 (ns hiccupdemo.core
                   (:use hiccup.core)
                   (:use hiccup.page)
                   (:use hiccup.element)




 JUG Summer Camp 2012              70      Claude Falguiere
jeudi 13 septembre 2012                                       70
FORMATER LA TABLE

                    (defn build-table [{:keys [rows]}]
                       (html [:table
                          (table-headers)
                          (map table-row rows)
                         ]))
                         ))




 JUG Summer Camp 2012                  71                Claude Falguiere
jeudi 13 septembre 2012                                                     71
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 Falguiere
jeudi 13 septembre 2012                                             72
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 Falguiere
jeudi 13 septembre 2012                                                          73
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 Falguiere
jeudi 13 septembre 2012                                                           74
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 Falguiere
jeudi 13 septembre 2012                                                          75
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 Falguiere
jeudi 13 septembre 2012                                                            76
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 Falguiere
jeudi 13 septembre 2012                                                              77
Faire un job
  MapReduce Hadoop
 JUG Summer Camp 2012     78   Claude Falguiere
jeudi 13 septembre 2012                           78
MAP REDUCE




 JUG Summer Camp 2012         79       Claude Falguiere
jeudi 13 septembre 2012                                   79
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 Falguiere
jeudi 13 septembre 2012                                                                 80
JUG Summer Camp 2012     81   Claude Falguiere
jeudi 13 septembre 2012                           81
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 Falguiere
jeudi 13 septembre 2012                                            82
JUG Summer Camp 2012     83   Claude Falguiere
jeudi 13 septembre 2012                           83
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 Falguiere
jeudi 13 septembre 2012                                          84
LEIN JAR


                          lein jar

                          et installer déployer dans hadoop




 JUG Summer Camp 2012                      85                 Claude Falguiere
jeudi 13 septembre 2012                                                          85
CASCALOG
                             Cascading + Datalog + Clojure


                               Dites, vous aimez Prolog ?

                          user=> (?<- (stdout)
                                  [?person ?age]
                                  (age ?person ?age)
                                  (< ?age 30))




 JUG Summer Camp 2012                      86                Claude Falguiere
jeudi 13 septembre 2012                                                         86
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 Falguiere
jeudi 13 septembre 2012                                                      87
CLAUDE FALGUIERE




                          @cfalguiere
                          goo.gl/4mmJQ        Merci

 JUG Summer Camp 2012                    88     Claude Falguiere
jeudi 13 septembre 2012                                            88

Más contenido relacionado

Más de Claude Falguiere

Le monitoring à l'heure de DevOps et Big Data
Le monitoring à l'heure de DevOps et Big DataLe monitoring à l'heure de DevOps et Big Data
Le monitoring à l'heure de DevOps et Big DataClaude Falguiere
 
Présentation du user group Duchess France au GDG de Nantes
Présentation du user group Duchess France au GDG de NantesPrésentation du user group Duchess France au GDG de Nantes
Présentation du user group Duchess France au GDG de NantesClaude Falguiere
 
Présentation de Page Speed au GDG de Nantes
Présentation de Page Speed au GDG de NantesPrésentation de Page Speed au GDG de Nantes
Présentation de Page Speed au GDG de NantesClaude Falguiere
 
Présentation Performances Montpellier
Présentation Performances Montpellier Présentation Performances Montpellier
Présentation Performances Montpellier Claude Falguiere
 
Pres android nuit de l'info v3
Pres android nuit de l'info v3Pres android nuit de l'info v3
Pres android nuit de l'info v3Claude Falguiere
 
Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Claude Falguiere
 
La marmite Intro session NoSQL
La marmite Intro session NoSQLLa marmite Intro session NoSQL
La marmite Intro session NoSQLClaude Falguiere
 
Analyse de données avec Incanter
Analyse de données avec IncanterAnalyse de données avec Incanter
Analyse de données avec IncanterClaude Falguiere
 
Analyse de données avec Incanter
Analyse de données avec IncanterAnalyse de données avec Incanter
Analyse de données avec IncanterClaude Falguiere
 
Deploiement continu breizh camp
Deploiement continu breizh campDeploiement continu breizh camp
Deploiement continu breizh campClaude Falguiere
 
Deploiement continu AgileFfrance 2011
Deploiement continu AgileFfrance 2011Deploiement continu AgileFfrance 2011
Deploiement continu AgileFfrance 2011Claude Falguiere
 
Mesurer les performances avec JMeter
Mesurer les performances avec JMeterMesurer les performances avec JMeter
Mesurer les performances avec JMeterClaude Falguiere
 
No sql pour valtech tech days
No sql pour valtech tech daysNo sql pour valtech tech days
No sql pour valtech tech daysClaude Falguiere
 
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010Claude Falguiere
 

Más de Claude Falguiere (15)

Le monitoring à l'heure de DevOps et Big Data
Le monitoring à l'heure de DevOps et Big DataLe monitoring à l'heure de DevOps et Big Data
Le monitoring à l'heure de DevOps et Big Data
 
Présentation du user group Duchess France au GDG de Nantes
Présentation du user group Duchess France au GDG de NantesPrésentation du user group Duchess France au GDG de Nantes
Présentation du user group Duchess France au GDG de Nantes
 
Présentation de Page Speed au GDG de Nantes
Présentation de Page Speed au GDG de NantesPrésentation de Page Speed au GDG de Nantes
Présentation de Page Speed au GDG de Nantes
 
Présentation Performances Montpellier
Présentation Performances Montpellier Présentation Performances Montpellier
Présentation Performances Montpellier
 
Pres android nuit de l'info v3
Pres android nuit de l'info v3Pres android nuit de l'info v3
Pres android nuit de l'info v3
 
Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012
 
La marmite Intro session NoSQL
La marmite Intro session NoSQLLa marmite Intro session NoSQL
La marmite Intro session NoSQL
 
Analyse de données avec Incanter
Analyse de données avec IncanterAnalyse de données avec Incanter
Analyse de données avec Incanter
 
Analyse de données avec Incanter
Analyse de données avec IncanterAnalyse de données avec Incanter
Analyse de données avec Incanter
 
Diagnostic performances
Diagnostic performancesDiagnostic performances
Diagnostic performances
 
Deploiement continu breizh camp
Deploiement continu breizh campDeploiement continu breizh camp
Deploiement continu breizh camp
 
Deploiement continu AgileFfrance 2011
Deploiement continu AgileFfrance 2011Deploiement continu AgileFfrance 2011
Deploiement continu AgileFfrance 2011
 
Mesurer les performances avec JMeter
Mesurer les performances avec JMeterMesurer les performances avec JMeter
Mesurer les performances avec JMeter
 
No sql pour valtech tech days
No sql pour valtech tech daysNo sql pour valtech tech days
No sql pour valtech tech days
 
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
 

Incanter bigdata jsc2012

  • 1. BigData avec Incanter et Clojure JUG Summer Camp 2012 Claude Falguière @cfalguiere goo.gl/4mmJQ 1 jeudi 13 septembre 2012 1
  • 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 Falguiere jeudi 13 septembre 2012 2
  • 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 Falguiere jeudi 13 septembre 2012 3
  • 4. INCANTER = + Math, Stats, Graps JUG Summer Camp 2012 4 Claude Falguiere jeudi 13 septembre 2012 4
  • 5. INCANTER DSL manipulation de matrices et tables statistiques charts modèles test d’hypothèse JUG Summer Camp 2012 5 Claude Falguiere jeudi 13 septembre 2012 5
  • 6. INCANTER Ecosystème Java Netlib Parallel Colt JFreeChart Motivation pour se mettre à Clojure Langage Fonctionnel JUG Summer Camp 2012 6 Claude Falguiere jeudi 13 septembre 2012 6
  • 7. CLAUDE FALGUIERE goo.gl/4mmJQ http://cfalguiere.wordpress.com @cfalguiere JUG Summer Camp 2012 7 Claude Falguiere jeudi 13 septembre 2012 7
  • 8. ET VOUS ? ? ? ? JUG Summer Camp 2012 8 Claude Falguiere jeudi 13 septembre 2012 8
  • 9. Petit rappel Clojure JUG Summer Camp 2012 9 Claude Falguiere jeudi 13 septembre 2012 9
  • 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 Falguiere jeudi 13 septembre 2012 10
  • 11. LES NOMBRES (+ 1 2 3) -> 7 (+ 4 (* 2 3)) -> 10 (= 2 (+ 1 1)) -> true JUG Summer Camp 2012 11 Claude Falguiere jeudi 13 septembre 2012 11
  • 12. Lire et explorer des données JUG Summer Camp 2012 12 Claude Falguiere jeudi 13 septembre 2012 12
  • 13. SE LANCER La voie du novice 1) downloader Incanter 2) lancer le REPL JUG Summer Camp 2012 13 Claude Falguiere jeudi 13 septembre 2012 13
  • 14. LES EXEMPLES https://github.com/cfalguiere/ ClojureBigDataJugSummerCamp2012 JUG Summer Camp 2012 14 Claude Falguiere jeudi 13 septembre 2012 14
  • 15. PREMIER SCRIPT JUG Summer Camp 2012 15 Claude Falguiere jeudi 13 septembre 2012 15
  • 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 Falguiere jeudi 13 septembre 2012 16
  • 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 Falguiere jeudi 13 septembre 2012 17
  • 18. LES COLLECTIONS Incanter Matrix Dataset JUG Summer Camp 2012 18 Claude Falguiere jeudi 13 septembre 2012 18
  • 19. LES MAPS Clojure (def conf {:name "JUG Summer Camp", :location "La Rochelle" }) JUG Summer Camp 2012 19 Claude Falguiere jeudi 13 septembre 2012 19
  • 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 Falguiere jeudi 13 septembre 2012 20
  • 21. LES COLONNES user>($ :t ds) user> (mean ($ :t ds)) 994,75 JUG Summer Camp 2012 21 Claude Falguiere jeudi 13 septembre 2012 21
  • 22. QUANTILE 95% (quantile ($ :t ds) :probs [0.95]) 911.1758241758242 Temps maximum pour 95% des relevés JUG Summer Camp 2012 22 Claude Falguiere jeudi 13 septembre 2012 22
  • 23. LES COLONNES (view ($ [:lb :t :shop] ds )) -> ) JUG Summer Camp 2012 23 Claude Falguiere jeudi 13 septembre 2012 23
  • 24. LES LIGNES ($where {:s "true"} ds) -> les lignes OK JUG Summer Camp 2012 24 Claude Falguiere jeudi 13 septembre 2012 24
  • 25. LES LIGNES ($where {:s "true" :shop {:$in #{"MAF", "FAB"}} :t {:$gt 3000 :$lt 5000}} ds) JUG Summer Camp 2012 25 Claude Falguiere jeudi 13 septembre 2012 25
  • 26. WITH-DATA (with-data ds ds (view ($ :t ($where {:shop "MAF"} )))) ds))) ds)) ds) JUG Summer Camp 2012 26 Claude Falguiere jeudi 13 septembre 2012 26
  • 27. INCANTER CHARTS Time-series Scatter Plot Bar charts Histograms Box Plot JUG Summer Camp 2012 27 Claude Falguiere jeudi 13 septembre 2012 27
  • 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 Falguiere jeudi 13 septembre 2012 28
  • 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 Falguiere jeudi 13 septembre 2012 29
  • 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 Falguiere jeudi 13 septembre 2012 30
  • 31. REGROUPEMENT (def groups ($group-by :shop ds)) { "MAF" {:shop "MAF"} "FAB" {:shop "FAB"} }} JUG Summer Camp 2012 31 Claude Falguiere jeudi 13 septembre 2012 31
  • 32. LIRE UN GROUPE (get groups {:shop "MAF"}) JUG Summer Camp 2012 32 Claude Falguiere jeudi 13 septembre 2012 32
  • 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 Falguiere jeudi 13 septembre 2012 33
  • 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 Falguiere jeudi 13 septembre 2012 34
  • 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 Falguiere jeudi 13 septembre 2012 35
  • 36. ENREGISTRER LES CHARTS (save (histogram :t :data ds) "histogram.png") JUG Summer Camp 2012 36 Claude Falguiere jeudi 13 septembre 2012 36
  • 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 Falguiere jeudi 13 septembre 2012 37
  • 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 Falguiere jeudi 13 septembre 2012 38
  • 39. Construire un projet Clojure JUG Summer Camp 2012 39 Claude Falguiere jeudi 13 septembre 2012 39
  • 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 Falguiere jeudi 13 septembre 2012 40
  • 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 Falguiere jeudi 13 septembre 2012 41
  • 42. SE LANCER La voie du gourou installer leiningen lein new myproject configurer project.clj lein <task> JUG Summer Camp 2012 42 Claude Falguiere jeudi 13 septembre 2012 42
  • 43. NEW demo classes lib project.clj src demo core.clj test demo test core.clj JUG Summer Camp 2012 43 Claude Falguiere jeudi 13 septembre 2012 43
  • 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 Falguiere jeudi 13 septembre 2012 44
  • 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 Falguiere jeudi 13 septembre 2012 45
  • 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 Falguiere jeudi 13 septembre 2012 46
  • 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 Falguiere jeudi 13 septembre 2012 47
  • 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 Falguiere jeudi 13 septembre 2012 48
  • 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 Falguiere jeudi 13 septembre 2012 49
  • 50. MAPPER UNE COLONNE ($map fct-to-date :ts ds ) JUG Summer Camp 2012 50 Claude Falguiere jeudi 13 septembre 2012 50
  • 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 Falguiere jeudi 13 septembre 2012 51
  • 52. MAPPER UNE COLONNE arg ($map #(coerce/from-long %):ts ds )) :ts ds fonction anonyme JUG Summer Camp 2012 52 Claude Falguiere jeudi 13 septembre 2012 52
  • 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 Falguiere jeudi 13 septembre 2012 53
  • 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 Falguiere jeudi 13 septembre 2012 54
  • 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 Falguiere jeudi 13 septembre 2012 55
  • 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 Falguiere jeudi 13 septembre 2012 56
  • 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 Falguiere jeudi 13 septembre 2012 57
  • 58. LEIN REPL lein repl REPL started; server listening on localhost port 61426 demo.core=> JUG Summer Camp 2012 58 Claude Falguiere jeudi 13 septembre 2012 58
  • 59. LES GRIMOIRES incanter.org data-sorcery.org github.com/liebke/incanter Incanter sur Stackoverflow Incanter Google Group JUG Summer Camp 2012 59 Claude Falguiere jeudi 13 septembre 2012 59
  • 60. Stocker les données JUG Summer Camp 2012 60 Claude Falguiere jeudi 13 septembre 2012 60
  • 61. ARCHITECTURE Document Incanter.mongodb MongoDB CongoMongo Server Clojure JUG Summer Camp 2012 61 Claude Falguiere jeudi 13 septembre 2012 61
  • 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 Falguiere jeudi 13 septembre 2012 62
  • 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 Falguiere jeudi 13 septembre 2012 63
  • 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 Falguiere jeudi 13 septembre 2012 64
  • 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 Falguiere jeudi 13 septembre 2012 65
  • 66. JDBC pas d’intégration Incanter JDBC des librairies Clojure clojure.java.jdbc Korma ClojureQL JUG Summer Camp 2012 66 Claude Falguiere jeudi 13 septembre 2012 66
  • 67. Générer un rapport HTML JUG Summer Camp 2012 67 Claude Falguiere jeudi 13 septembre 2012 67
  • 68. LE WEB ET CLOJURE Enlive ou Hiccup Moustache ou Compojure Ring JUG Summer Camp 2012 68 Claude Falguiere jeudi 13 septembre 2012 68
  • 69. LE RAPPORT JUG Summer Camp 2012 69 Claude Falguiere jeudi 13 septembre 2012 69
  • 70. HICCUP (ns hiccupdemo.core (:use hiccup.core) (:use hiccup.page) (:use hiccup.element) JUG Summer Camp 2012 70 Claude Falguiere jeudi 13 septembre 2012 70
  • 71. FORMATER LA TABLE (defn build-table [{:keys [rows]}] (html [:table (table-headers) (map table-row rows) ])) )) JUG Summer Camp 2012 71 Claude Falguiere jeudi 13 septembre 2012 71
  • 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 Falguiere jeudi 13 septembre 2012 72
  • 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 Falguiere jeudi 13 septembre 2012 73
  • 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 Falguiere jeudi 13 septembre 2012 74
  • 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 Falguiere jeudi 13 septembre 2012 75
  • 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 Falguiere jeudi 13 septembre 2012 76
  • 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 Falguiere jeudi 13 septembre 2012 77
  • 78. Faire un job MapReduce Hadoop JUG Summer Camp 2012 78 Claude Falguiere jeudi 13 septembre 2012 78
  • 79. MAP REDUCE JUG Summer Camp 2012 79 Claude Falguiere jeudi 13 septembre 2012 79
  • 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 Falguiere jeudi 13 septembre 2012 80
  • 81. JUG Summer Camp 2012 81 Claude Falguiere jeudi 13 septembre 2012 81
  • 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 Falguiere jeudi 13 septembre 2012 82
  • 83. JUG Summer Camp 2012 83 Claude Falguiere jeudi 13 septembre 2012 83
  • 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 Falguiere jeudi 13 septembre 2012 84
  • 85. LEIN JAR lein jar et installer déployer dans hadoop JUG Summer Camp 2012 85 Claude Falguiere jeudi 13 septembre 2012 85
  • 86. CASCALOG Cascading + Datalog + Clojure Dites, vous aimez Prolog ? user=> (?<- (stdout) [?person ?age] (age ?person ?age) (< ?age 30)) JUG Summer Camp 2012 86 Claude Falguiere jeudi 13 septembre 2012 86
  • 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 Falguiere jeudi 13 septembre 2012 87
  • 88. CLAUDE FALGUIERE @cfalguiere goo.gl/4mmJQ Merci JUG Summer Camp 2012 88 Claude Falguiere jeudi 13 septembre 2012 88