---
# System prepended metadata

title: '[Cours] DATA (cours 2) - 07/05/2021'
tags: [' ICE', Data, ' Cours']

---

---
title: "[Cours] DATA (cours 2) - 07/05/2021"
tags: Data, Cours, ICE
---

# [Cours] DATA (cours 2) - 07/05/2021


```
Intervenant :
    Cédric Joly
Slides du cours :
    https://epitafr.sharepoint.com/:b:/r/sites/GITM-2022/Documents%20partages/COURS%20-%20Data%20(M.%20Joly)/Data2.pdf?csf=1&web=1&e=QGgTYX
```
---
## Hadoop
La plateforme de référence pour faire du Big Data.

Créée en 2006 par le créateur de Apache, devient Open Source en 2008 puis finit par rejoindre Apache en 2009. Aujourd'hui la fondation Apache contient énormément de projets Open Source (qu'ils aient commencé en tant que tel ou pas). 

Cet outil a été développé en Java, c'est le cas de beaucoup d'outils dans l'écosystème de Apache. Ainsi, une connaissance du langage est nécessaire. 

L'outil est inspiré de ces 3 publications pour poser les bases : 
- GoogleFS (2003)
- MapReduce (2004)
- Bigtable (2006) : base de donnée inspirée SQL

Comme c'est un énorme écosystème plein de solutions toutes plus complexes les unes que les autres, il y a la possibilité de télécharger et déployer une version *Vanilla* de Hadoop. Cependant même l'architecture de base reste complexe. Ainsi, il existe des solutions commerciales qui ont développé des sur-couches par-dessus Hadoop, généralement avec une interface. Cela était à l'époque de l'essor de la BigData (aujourd'hui l'intérêt est plus poussé sur le Machine Learning). Il existe donc des solutions moins complexes et plus rapides que Hadoop. Voici quelques exemples de ces distributions construites par-dessus : 
- Cloudera + Hortonworks (2016)
- MapR => HPE Ezmeral Data Fabric (2019)
- Amazon EMR (Elastic MapReduce) : ce qu'on va utiliser de nos jours si on veut faire du Hadoop
- Azure HDInsight
- IBM BigInsight

Aujourd'hui il est beaucoup plus facile d'utiliser Hadoop et de le scale en fonction de la Data à traiter (grosses quantité de données, etc...).

Quand on va monter une plateforme Hadoop, il va falloir adhérer à des principes / briques de base, les voici : 
- Hadoop Common
- HDFS (Hadoop Distributed File System) : offre une capacité à être scalable (étendre ou réduire les données)
- Map Reduce : être capable de prendre mes données et de les répartir sur mes noeuds de manière cohérente pour pouvoir être suivi par mon système (sur mes clusters) et redispatcher les résultats par la suite (distribution de fichier -> calcul -> redispatcher les résultats pour les consolider ensemble -> résultat final)
- YARN (Yet Another Resource Negociator) depuis Hadoop 2 (après Map Reduce)


C'est aussi un écosystème riche et complexe (A.K.A. le graphe ci-dessous) : 

![](https://i.imgur.com/OhOszON.png)

D'autres sources : 
- https://blogs.sap.com/2019/06/24/hadoop-ecosystem-welcome-to-the-hadoop-zoo/
- http://security-soft.co.uk/blog/hadoop-overview-data-management-powerhouse/index.html
- https://dzone.com/articles/hadoop-ecosystem-hadoop-tools-for-crunching-big-da

## Spark
Aujourd'hui les gens ont peut-être plus entendu parler de Spark. Il a été le concurrent d'Hadoop à un moment. Hadoop est capable de traiter d'énormes quantités de données mais à quelques limitations sur son MapReduce. Spark fait tout son traitement *in-memory*. Tant qu'il a de la place en mémoire il va enchaîner les étapes pour faire le traitement. Il est donc beaucoup plus rapide. 

Il y a tout une suite d'outils qui sont venus se positionner par dessus : 
- SparkSQL
- Spark Streaming
- Spark Graph X
- Spark MLlib

Originellement, il fait partie du système Hadoop car il va chercher ses données sur du HDFS.

## Kafka 
L'idée de Kafka c'est d'un côté les producteurs de données et de l'autre les consommateurs. Kafka va permettre à une multitude de consommateurs de récupérer des données, une donnée pour plusieurs types de consommateurs différents. 1 donnée serveur -> 1 groupe consommateur technique + 1 consommateur marketing (qui garde la donnée). Kafka propose aujourd'hui plusieurs façons de se déployer avec des Dashboards.

## Elastic Suite 
À la base Elastic Search, c'est la base de données qui permet de faire de la recherche full Text sur des grosses bases de données (ainsi que de l'analyse et de la dataviz). 
### Elastic Suite (exemple)
Déploiement instantané avec docker : 
```Docker=
docker network create elastic
docker run --name es01 --net  elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.12.1
docker run --name kib01 --net  elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01:9200" docker.elastic.co/kibana/kibana:7.12.1
http://localhost:5601
```
On peut générer tout plein de dataviz :smiley: 
On peut gérer : 
- Search 
- Observability (centraliser & surveiller)
- Security (SIEM & sécurité des Endpoints)
- Kibana (visualiser et analyser)

## Neo4j
Projet assez ancien, Open sourcé en 2007, c'est un projet avec une belle maturité. C'est une base de donnée orientée graphe et dataviz. Le but est de stocker les données sous format de graphes (liées ensembles). C'est ce que fait FaceBook sur les mises en relation. Il a plusieurs composants : 
- Graph Database 
- Cypher Query language
- Bloom
- Graph Data Science Library
- GraphQL library

## Tableau 
Crée en 2003, acheté par SalesForce en 2019. Il possède dans sa suite des solutions assez pratiques pour faire du traitement de donnée sans pour autant rentrer dans les solutiosn très techniques comme celles qui viennent auparavant. Il possède plusieurs produits : 
- Tableau Desktop (easy to use) : on charge un fichier .csv, nous permet de trier les données, faire de la dataviz dessus et de produire un rapport (c'est Excel sous stéroïdes)
- Tableau Server
- Tableau Public
- Tableau Online
- Tableau Prep
- TableauCRM

## QlikView
Concurrent de Tableau, société suédoise créée en 1993. Ils sont focalisés dans ce qu'on voit le plus, c'est à dire la visualisation de donnée et leur mise en avant afin de pouvoir faire du data storytelling. 

## PowerBI
Créé en 2011, il possède les mêmes notions de service que QuilView et Tableau. Il permet de traiter toute la chaîne de données, leur force est de pouvoir faire de la dataviz et raconter des histoires avec les données fournies. Possède un client desktop pour faire le traitement sur des machines.

## Gephi
Solution Open Source qui n'est plus très maintenue (création en 2008). Il reste cependant une référence pour représenter les données en graphes. Leur spécialité est la *Graph Vizualisation & Exploration* : 

![](https://i.imgur.com/Msm9Rg6.png)

Même si cet outil est vieux, il reste une source sûre.

## Introduction à Neo4j
:warning: Un *graph* n'est pas une *chart*. Ce sont des noeuds qui sont reliés entre eux par des relations.

### Les bases
Donc voici la base de Neo4j : 

![](https://i.imgur.com/9acsTK7.png)

Des noeuds reliés par des relations. Cependant les noeuds dans Neo4j sont dirigés.

Quelques propriétés :

- Sur un même noeud on peut avoir plusieurs labels (un noeud =/= un label)
- Des noeuds avec des labels identiques ne vont pas forcément avoir les mêmes propriétés (mais vont globalement avoir les mêmes, il peut en manquer 1 ou 2)
- Les noeuds ont des valeurs


On peut avoir 1 ou plusieurs labels, voir pas de label. La bonne pratique étant de dire que si on a un label, des propriétés y sont associées. À noter que les relations sont aussi porteuses d'informations.

### Cypher - Structure de base
Inspiré de l'ASCII ART : 
```Cypher=
(:Label1)-[:RELATION]->(:Label2)

(var:Label1)-[var_rel:RELATION]->(:Label2)

(var:Label1 {propriete: valeur})
```

### Cypher - Commandes 
- MATCH
- WHERE
- CREATE / MERGE
- SET 
- RETURN
- ORDER 
- DISTINCT
- count()
- sum()
- collect()

### Resources
Neo4j a une communauté très présente, il y a des *trainings* ainsi que des certification gratuites Neo4j disponibles (elles sont qualitatives).

- https://neo4j.com/developer/get-started/
- https://neo4j.com/docs/cypher-refcard/current/
- https://neo4j.com/docs/cypher-manual/current/styleguide/
- https://neo4j.com/graphacademy/training-intro-40/enrollment/
- https://neo4j.com/graphacademy/neo4j-certification/

---

### TD

![](https://i.imgur.com/Q5f7cAC.png)

Neo4j Browser : rentrer et manipuler de la donnée
Neo4j Bloom : visualiser les données

Pour supprimer toute la base de donnée :
```Neo4j=
MATCH (n) DETACH DELETE n;
```

`DETACH` permet la suppression de la relation

`MATCH (n) RETURN n LIMIT 25` Permet d'afficher 25 éléments.

Site pour créer des graphs relationnels : [Arrows](https://arrows.app)


### Methodologie de travail sur une base de donnée

#### Trouver sa base de donnée

* D'abord trouver ta base de donnée, pour ça on peut avoir le site : [data.gouv.fr](www.data.gouv.fr/fr/)

> Par exemple : [https://www.data.gouv.fr/fr/datasets/subventions-equipements-et-plateformes-scientifiques-et-technologiques-sesame/](https://www.data.gouv.fr/fr/datasets/subventions-equipements-et-plateformes-scientifiques-et-technologiques-sesame/)

#### Réalisation du design que l'on souhaite

* Ensuite, on fait un design pour mettre en avant les infos que l'on veut en utilisant [Arrows](https://arrows.app)
  On peut éventuellement utiliser neo4j pour l'afficher, pour ce faire on fait `download/export` puis ensuite on va dans Cypher et on colle la ligne dans neo4j
  **Attention**: Sur les flèches, il ne faut surtout pas mettre un nom avec des espaces. Ça ne passe pas sur Neo4j.
  
```Cypher!
CREATE (:`Organisme de recherche` {nom: "ENS"})<-[:DEPEND_DE]-(:Laboratoire {nom: "Laboratoire des Systèmes Perceptifs", code_labo: "UMR 8248", acronyme: "LSP-ENS"})<-[:PORTE_PAR]-(n0:Projet {nom: "Imagerie functionnelle", cout_total: "300,000"})-[:CONCERNE]->(:Discipline {nom: "Biologie, médecine et santé"}),

(n0)-[:RECOIT]->(:Financement {montant: "195,000", annee: 2019})-[:FINANCE]->(:`Matériel` {type: "Echographe 128 canaux"})
```

![](https://i.imgur.com/xFfRdkm.png)

#### Récupération des données dans neo4j
 
##### Depuis le site :

* On peut récupérer tout le CSV dans Neo4j. On peut faire la chose suivante pour tout charger d'un coup :
```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
RETURN line
```

##### Depuis ton pc :

* Il faut copier coller ton fichier dans ton répertoire, pour ça tu ouvre le terminal et tu fais un cp depuis download.
* Si tu galère avec le terminal, récupère le path vers le dossier de ton projet ensuite tu peux faire un copier-coller vers ton path
* Ensuite dans neo4j tu fait : 
```Neo4j=
LOAD CSV WITH HEADERS FROM 'files:///nom_du_fichier.csv' AS line RETURN line
```

##### Exemples d'utilisation

* Si l'on souhaite récupérer uniquement une valeur du json retourné (`toInteger` permet de transformer en int.), on fait line.cout_total_du_projet car on avait fait AS line :
```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
RETURN toInteger(line.cout_total_du_projet)
```

* Si on souhaite faire un sum : 
```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
RETURN sum(toInteger(line.cout_total_du_projet))
```

* Exemple plus grand : 
```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
WITH * ORDER BY line.annee
RETURN line.departement AS Departement, sum(toInteger(line.cout_total_du_projet)) AS Montant, collect(DISTINCT line.annee)
ORDER BY Montant DESC
```

* On peut faire plein d'autre truc que l'on souhaite en utilisant du SQL classique et voir la doc de neo4j


#### Sauvegarde dans neo4j

Maintenant qu'on sait récupérer il faut réussir à les sauvegarder.

```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
MERGE (:Organisme {nom: line.organisme_de_recherche_ou_d_es_beneficiaire})
```

Ici, on utilise `MERGE` et pas `CREATE` car si on a des données dupliquées elles vont apparaître plusieurs fois.

#### Création du graphe

Pour créer son graph, on doit ajouter de la relation : 

```Neo4j=
LOAD CSV WITH HEADERS FROM 'https://www.data.gouv.fr/fr/datasets/r/b95bf217-ae3f-49b8-a2ea-403ae720a7e9' AS line
FIELDTERMINATOR ";"
MERGE (:Organisme {nom: line.organisme_de_recherche_ou_d_es_beneficiaire})
MERGE (:Laboratoire {nom: coalesce(line.libelle_du_laboratoire_d_execution, "unnamed")})
MERGE (l)-[:DEPEND_DE]->(o)
```

Après la commande pour afficher le nom, il faut cliquer sur "Laboratoire" puis ensuite sur "nom" pour afficher les noms.