---
type: Connaissance
title: "Data Engineering"
description: "Comprendre le rôle du data engineer, les architectures de données et les outils utilisés pour collecter, stocker, publier et gouverner les données."
tags: [data-engineering, big-data, data-management]
---

*Ce guide a été écrit notamment grâce à la lecture du livre [Scalable Data Architecture with Java: Build efficient enterprise-grade data architecting solutions using Java](https://amzn.to/4ckaW4b).*

Le data engineer définit, développe, met en place et maintient les outils et infrastructures nécessaires à l'analyse de données. Le but de cet article est de présenter les principaux outils et technologies qui permettent de mettre en place ce type d'architecture.

## Dimensions de la donnée

On peut analyser la donnée sous quatre angles différents :
- **Volume** : la quantité de données.
- **Vélocité** : la vitesse à laquelle les données sont produites.
- **Variété** : la diversité des formats des données.
- **Véracité** : la fiabilité des données (à quel point on peut leur faire confiance).

## Types de problèmes

### Problèmes de traitement
Ces problèmes rassemblent tout ce qui concerne la collecte des données, leur traitement et leur stockage.

Il y a trois types de traitement :
- Les traitements temps réel, généralement traités comme un flux de données auquel on réagit (de quelques secondes à 5 minutes). On utilise habituellement des bus de données ou d’événements, car la capacité du consommateur doit être supérieure à la capacité du producteur d’événement (framework pub/sub).
- Les traitements en quasi-temps réel (de quelques minutes à une heure).
- Les traitements batch, qui correspondent à des imports ou à des générations de rapports (plus d'une heure).

*Au-dessus de 10 téraoctets, on parle de Big Data.*

### Problèmes de publication
La problématique ici est de publier les données aux bonnes personnes en toute sécurité et avec une gouvernance adéquate des données.

Il y a trois types de publication :
- Les rapports, qui sont des exports de données (tableaux de bord, rapports, etc.) que l'on peut réaliser avec Elasticsearch, Kibana ou Superset.
- Les API qui sont des interfaces de programmation qui permettent d'accéder aux données.
- Les référentiels de données : data lake, data warehouse et data mart.

## Stockage de données

### Formats de données
L'avantage des formats de données binaires est qu'ils sont plus légers que les formats textuels. Quand on ne sait pas forcément le volume de données auquel s'attendre, il vaut mieux faire ce choix.

[Apache Avro](https://avro.apache.org/) est un système de sérialisation de données open source qui permet de stocker et de transférer des données entre différents systèmes et langages de programmation de manière efficace. Voici quelques raisons pour lesquelles vous pourriez vouloir utiliser Apache Avro :
- **Performance** : Avro est conçu pour être extrêmement rapide et efficace en matière de traitement des données. Il peut gérer des volumes de données importants sans sacrifier les performances.
- **Portabilité** : Avro est conçu pour être utilisé avec une variété de langages de programmation. Cela signifie que vous pouvez facilement transférer des données entre différentes applications, même si elles sont écrites dans des langages différents.
- **Interopérabilité** : Avro prend en charge la définition de schémas de données. Cela permet à différents systèmes de communiquer entre eux en utilisant un schéma commun. Cela facilite la communication entre les systèmes et réduit les erreurs liées aux incompatibilités de données.
- **Compression** : Avro prend en charge la compression de données, ce qui peut réduire considérablement la quantité de données à stocker ou à transférer.
- **Évolution** : Avro prend en charge l'évolution des schémas de données au fil du temps. Cela signifie que vous pouvez ajouter de nouveaux champs à vos schémas de données sans "casser" les applications existantes.

### Stockage de données
Il existe trois types de stockage de données :
- **Stockage de fichiers** : un fichier est créé, il a un nom et se trouve dans un dossier. Ceci ne permet pas de passer facilement à l'échelle ni de gérer de très gros fichiers.
- **Stockage en blocs** : on découpe le fichier en blocs de taille fixe. On peut ensuite les stocker sur différents serveurs. Ceci permet de passer à l'échelle en ajoutant des blocs. Le problème est que cela peut coûter assez cher et qu'il faut gérer les métadonnées. On trouve ce système dans la virtualisation, par exemple avec Oracle VirtualBox.
- **Stockage objet** : les données sont stockées dans des conteneurs appelés objets, qui ont un identifiant unique permettant une récupération et un stockage rapides. Cette solution est extrêmement scalable et moins coûteuse.

### Data lake, Data warehouse et Data mart

#### Data lake
Les data lakes contiennent les données provenant de diverses sources (applications, sites web, réseaux sociaux, bases de données, exports...). Ils servent de sources pour créer le data warehouse et peuvent aussi servir au reporting, à la data science ou au machine learning.

On peut y créer plusieurs zones :
- **Raw data zone** : Sources brutes.
- **Master data zone** : données de référence qui peuvent être utilisées pour enrichir les données brutes (ex. : open data).
- **User data zone** : Données utilisateurs spécifiques.
- **Curated data zone** : Données nettoyées et structurées.
- **Archive data zone** : Données archivées.

#### Data warehouse
Les data warehouses sont des bases de données qui contiennent des données consolidées et structurées, utilisées pour le reporting, l'analyse de données et la BI. En général, un data warehouse fait entre 100 gigaoctets et plusieurs téraoctets.

#### Data mart
Les data marts sont des bases de données qui contiennent des parties du data warehouse propres à certains métiers. En général, un data mart ne dépasse pas 100 gigaoctets.

## Base de données

### Types de base de données
Il existe deux types de bases de données, avec quelques sous-types :

- **Base de données relationnelle** : elles sont structurées en tables et sont très performantes pour les requêtes complexes. Il faut les utiliser dès que vous avez besoin de transactions ou de faire des jointures complexes.
- **Base de données NoSQL** : elles peuvent stocker les données sous différentes formes (clé/valeur, graphes, documents, etc.) et sont très performantes pour les requêtes simples, souvent parce que leurs données peuvent être distribuées.
    - **Clé/valeur** : elles sont très performantes pour les requêtes simples et sont très utilisées pour les caches.
    - **Documents** : elles sont très performantes pour stocker et requêter un document (JSON, XML...). Elles sont idéales pour stocker des flux dont les formats peuvent rapidement changer (ex. : Facebook, LinkedIn, Twitter, etc.) ou pour créer des
      moteurs de recherche comme ElasticSearch.
    - **Graphes** : elles sont très performantes pour stocker et requêter des données structurées en graphes.
    - **Colonnes** : ce sont des technologies de type BigTable, très performantes pour les requêtes simples et les requêtes de type "scan" (ex. : HBase, Cassandra, etc.). Elles peuvent absorber des volumes de données très importants tout en gardant de bonnes performances.

## ETL : Extract, Transform, Load
Nous utilisons ce type de solutions pour charger les données depuis nos sources vers le data warehouse.
- La première question à se poser : quelle vélocité pour nos données ? Afin de savoir si on est sur un traitement temps réel ou un traitement batch.
- La deuxième question à se poser : Est-ce que le volume de données est conséquent ? Si on travaille avec plusieurs téraoctets de données, on va devoir utiliser des outils spécialisés type Big Data.
- La troisième question à se poser : les données sont-elles structurées ? Si oui, on utilise une base de données relationnelle ; sinon, on doit les stocker dans une base NoSQL.

La solution qui semble la plus industrialisable est Spring Batch. Les scripts Talend ou Kettle sont beaucoup moins facilement testables. Si l'on avait besoin de traitements Big Data, on pourrait utiliser Apache Spark, notamment avec AWS EMR couplé à AWS Lambda.

Si l'on avait besoin de traitements temps réel, on partirait plutôt sur Kafka.

## Gouvernance des données
La solution qui paraît la plus cohérente est [DataHub](https://datahubproject.io/), qui permet de gérer les métadonnées et de les rendre accessibles.

Principaux avantages de DataHub :
- **Gestion des métadonnées** : permet de gérer les métadonnées de manière centralisée et de les rendre accessibles aux utilisateurs.
- **Gestion des droits** : permet de gérer les droits d'accès aux données.
- **Gestion des flux** : permet de voir les flux de données entre les différents systèmes.
