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
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
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
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
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
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