Le Blog Amazon Web Services

Comment effectuer des analyses avancées et visualiser vos données Amazon DynamoDB à l’aide d’Amazon Athena

Vous pouvez tirer énormément de valeur des milliards d’éléments contenu par votre base de donnée Amazon DynamoDB en en exécutant des millions de requêtes par seconde. Cependant, afin d’obtenir des informations riches, il être préférable mettre en place un pipeline Analytics qui sépare les traitements transactionnels effectués sur la base de donnée et l’analyse. Cet article vous montre comment créer un pipeline Analytics qui transfère les données de votre table DynamoDB vers Amazon S3. Vous pourrez ainsi effectuer des analyses avancées à l’aide d’Amazon Athena, un service de requête entièrement managé basé sur Presto, ainsi que des tableaux de bord et des analyses ad hoc à l’aide d’ Amazon QuickSight.

Afin de tirer parti des nouvelles technologies de calcul à mesure qu’elles arrivent, la plupart des applications Big Data ont un pipeline conçue pour séparer les fonctionnalités de stockage et de calcul. Ce découplage permet d’adapter le provisionnement des ressources de calcul en fonction des besoins d’analyse sans affecter le stockage et la durabilité des données. Vous pouvez également concevoir votre pipeline de sorte que les étapes de stockage et de traitement se répètent afin de façonner les données dans un format que les applications peuvent ensuite consommer rapidement.

Trois caractéristiques principales influencent la conception d’un pipeline Analytics :

  • Latence du pipeline global – Combien de temps avez-vous depuis l’ingestion des données à la production des indicateurs? Millisecondes, minutes ou jours ?
  • Volume des données – Quelle quantité de données doit être ingérée et traitée ? S’agit-il de gigaoctets, de téraoctets ou de pétaoctets ?
  • Coût – Quel est le budget cible de votre application ? L’option la plus économique dans AWS est souvent le bon choix.

D’autres éléments clés sont à prendre en compte lors de la conception de votre pipeline Big Data, notamment, la structure des données, les modalités d’accès, la température des données, la disponibilité et la durabilité, ainsi que l’utilisation d’un service entièrement managé. L’utilisation du bon outil au bon endroit est la clé d’un pipeline de Big Data bien architecturé.

Création d’un Pipeline Big Data

Avant de créer un pipeline Big Data, passons en revue les principaux services et fonctionnalités utilisés par cette solution.

Fonctionnalités de DynamoDB dans votre pipeline

Dans DynamoDB, les tables, les éléments et les attributs sont les composants principaux avec lesquels vous travaillez. Une table est une collection d’éléments et chaque élément est une collection d’attributs. DynamoDB utilise des clés primaires pour identifier chaque élément d’une table. Les index secondaires offrent une plus grande flexibilité d’interrogation. Pour plus d’informations, consultez Amazon DynamoDB: Comment ça marche dans Amazon DynamoDB – Guide du développeur.

Le paramètres Time To Live (TTL) de DynamoDB permet de supprimer automatiquement les éléments qui ne sont plus pertinents afin de réduire les coûts de stockage. Dans la suite de cet article de blog, vous activez TTL sur la table et utilisez l’attribut TTL pour définir la date et l’heure de suppression d’éléments. Pour plus d’informations sur la durée de vie, consultez Time to Live: Comment cela fonctionne ?

Vous utiliserez ensuite DynamoDB Streams pour capturer une séquence ordonnée dans le temps de toutes les modifications effectuées au niveau des éléments. Ces modification seront ensuite enregistrées dans Amazon S3. Pour plus d’informations sur DynamoDB Stream, voir Capturer l’activité des tables avec DynamoDB Streams.

Fonctionnalités d’AWS Lambda dans votre pipeline

AWS Lambda est un service de calcul qui vous permet d’exécuter du code sans provisionner ni gérer de serveurs. Lambda exécute votre code uniquement lorsque cela est nécessaire et s’adapte automatiquement pour répondre à des milliers de requêtes par seconde. Lambda s’occupe de la haute disponibilité, de la maintenance des serveurs, du système d’exploitation et des correctifs. Avec Lambda, vous ne payez que le temps de calcul consommé lorsque votre code est en cours d’exécution.

Lambda offre la possibilité d’appeler votre code en réponse à des événements, par exemple lorsqu’un objet est placé dans un compartiment S3. Dans notre cas, Lambda s’execute lors de la mises à jour d’un élément de la table DynamoDB. Dans cet article, vous créez une fonction Lambda qui sera déclenchée par DynamoDB Streams pour copier des éléments vers Amazon S3 à l’aide d’Amazon Kinesis Data Firehose.

Vous pouvez copier tous les éléments vers Amazon S3 si, par exemple, vous souhaitez effectuer des analyses sur l’intégralité des données. Vous pouvez également copier uniquement les éléments supprimés en raison de leurs TTL. Ces éléments contiennent dans leurs métadonnées un attribut supplémentaire pour les distinguer des éléments supprimés par un utilisateur. Il s’agit du champ userIdentity (illustré dans l’exemple suivant) qui indique que DynamoDB a effectué la suppression dans le cadre du traitement du TTL.

"userIdentity": {
"Type": "Service",
"PrincipalId": "dynamodb.amazonaws.com"
}

Pour transférer uniquement les données qui ont expirées en raison de leur TTL, modifiez la fonction Lambda pour copier uniquement les enregistrements où eventName est REMOVE et userIdentity contient PrincipalID égal à dynamodb.amazonaws.com .

L’intégration de Lambda dans le pipeline offre la possibilité supplémentaire d’effectuer de légères transformation sur les données avant de les stocker dans Amazon S3. La fonction Lambda de cette solution permet de “flatten” certaines des données imbriquées dans les objects JSON , ce qui peut potentiellement faciliter les jointures avec d’autres ensembles de données.

Fonctionnalités d’Amazon Athena dans votre pipeline

Athena est un service de requête interactif qui facilite l’analyse des données directement dans Amazon S3 à l’aide du standard SQL . Athena est serverless, il n’y a donc aucune infrastructure à configurer ou à gérer, et vous ne payez que pour les requêtes que vous exécutez. Athena s’adapte automatiquement, en exécutant des requêtes en parallèle, pour que les résultats soient rapides, même avec des ensembles de données volumineux et des requêtes complexes. Pour plus d’informations sur la configuration d’Athena, consultez Configuration dans Amazon Athena – Guide de l’utilisateur

Les données de DynamoDB sont importées dans Amazon S3 au format JSON. Habituellement, nous avons besoin d’un processus d’extraction, de transformation et de chargement (ETL) pour convertir les données dans un format plus adapté aux requêtes SQL. Athena utilise une autre approche connue sous le nom de “schéma en lecture”. Les définitions de table s’appliquent dynamiquement au moment de l’exécution des requêtes. Cela élimine le besoin d’un ETL pour le chargement des données. Dans cet article, nous utilisons un sérialiseur/désérialiseur JSON (SerDe) pour analyser les enregistrements JSON bruts et HIVE, un language de définition des données, pour créer une table externe. Une fois le schéma créé, vous pouvez commencer à interroger les données.

Solution d’ensemble

Après toutes ces explications, passons en revue le pipeline de bout en bout. Le schéma suivant illustre le fonctionnement de la solution.

Schéma d'architecture d'ensemble

  • Votre application écrit des données dans une table DynamoDB. Pour les besoins de cet article, nous fournissons un exemple de fonction Python pour remplir la table DynamoDB à l’aide d’un jeu de données.
  • La configuration du TTL de la table DynamoDB implique l’expiration et la suppression des éléments en fonction de leur l’attribut d’horodatage.
  •  DynamoDB stream capture une séquence chronologique des modifications au niveau des l’éléments de la table.
  • Une fonction Lambda écoute DynamoDB stream et écrit les éléments dans un flux de diffusion Kinesis Data Firehose. La fonction fournie place tous les nouveaux éléments dans le flux de diffusion Kinesis Data Firehose. Vous pouvez modifier la fonction pour placer uniquement les enregistrements des éléments supprimés après l’expiration du TTL en inspectant le champ userIdentity des métadonnées.
  • Kinesis Data Firehose envoie les données à Amazon S3.
  • Une fois les données dans Amazon S3, utilisez Athena pour créer une table externe, configurer des partitions et commencer à interroger les données.
  • Vous pouvez également configurer Amazon QuickSight pour visualiser les données et effectuer des requêtes ad hoc grace a Athena ou directement dans Amazon S3.
  • Votre application peut interroger des données chaudes directement dans DynamoDB mais également accéder à des données analytiques par les API d’Athena ou grace à des tableau de bord d’Amazon QuickSight.

Déploiement de la solution

Le modèle AWS CloudFormation fourni déploie la table DynamoDB, le Stream DynamoDB, le bucket S3, le flux de diffusion Kinesis Data Firehose et la fonction Lambda. Vous devez configurer manuellement Athena et Amazon QuickSight comme décrit dans la section suivante, « Validation de la solution et interrogation des données ».

Pour déployer la solution :

  • Téléchargez le code de la fonction Lambda ddb-to-firehose.py et chargez-le dans un bucket S3 de votre choix. Assurez-vous que le compartiment S3 se trouve dans la même région AWS où vous prévoyez de déployer la solution. Notez le nom du compartiment.
  • Choisissez Charger un fichier de modèle et sélectionné le modèle ddbathenablog_cf.yaml  que vous venez de télécharger. Choisissez Suivant.
  • Spécifiez un nom de pile et un nom de table DynamoDB (tel que Films). Spécifiez également le nom du compartiment dans lequel vous avez chargé le code de la fonction Lambda à l’étape 1. Choisissez Suivant.
  • Choisissez Suivant dans les Options
  • Sur la dernières page, cochez la case Je sais qu’AWS CloudFormation peut créer des ressources IAM et choisissez Soumettre.
  • Attendez quelques minutes jusqu’à ce que la pile AWS CloudFormation (une collection de ressources AWS) soit entièrement déployée et que l’état CREATE_COMPLETE  s’affiche avant de passer à la section suivante.

Validation de la solution et interrogation des données

Afin de valider la solution et de remplir rapidement la table DynamoDB, téléchargez le fichier de données et la fonction Python liés à cet article. Le script Python permet de charger le fichier de données exemple contenant des informations sur quelques milliers de films présent dans l’Internet Movie Database (IMDb). Pour chaque film, le fichier contient une année, un titre et un JSON nommé info. L’exemple de code suivant montre à quoi ressemblent les données.

{ 
    "year" : 2013, 
    "title" : "Turn It Down, Or Else!", 
    "info" : { 
        "directors" : [ 
            "Alice Smith", 
            "Bob Jones" 
        ], 
        "release_date" : "2013-01-18T00:00:00Z", 
        "rating" : 6.2, 
        "genres" : [ 
            "Comedy", 
            "Drama" 
        ], 
        "image_url" : "http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg", 
        "plot" : "A rock band plays their music at high volumes, annoying the neighbors.", 
        "rank" : 11, 
        "running_time_secs" : 5215, 
        "actors" : [ 
            "David Matthewman", 
            "Ann Thomas", 
            "Jonathan G. Neff" 
        ] 
     } 
}

Pour valider la solution et remplir la table DynamoDB :

  • Téléchargez le script LoadMovieData.py et le moviedata.zip. Extrayez le fichier moviedata.json de l’archive moviedata.zip.
  • Modifiez le script LoadMovieData.py et mettez à jour les valeurs de region_name et dynamodb. Table correspondant à votre région AWS et au nom de la table.
dynamodb = boto3.resource('dynamodb', region_name='
us-east-1
')
table = dynamodb.Table('films')
  • Ouvrez une fenêtre de commande et exécutez le script Python suivant pour télécharger les données.
PATH
\LoadMovieData.py 
PATH
\moviedata.json

Dès que les enregistrements sont chargés dans la table DynamoDB vous devriez voir le message suivant :

10 rows inserted
20 rows inserted
30 rows inserted
…
4600 rows inserted
  • Ouvrez la console DynamoDB console, choisissez Tables, puis la table Films et enfin Items. Vous devriez voir les 100 premiers éléments, comme illustré dans la capture d’écran suivante.

Table DDB Films

  • Ouvrir la console Amazon S3 console et allez dans le bucket créé par la solution. Vous pouvez trouver le nom de ce bucket en vous rendant dans la console AWS Clouformation, selectionant la stack pour l’onglet Resources. Le contenu du Bucket S3 doit etre de la forme ci-dessous

Chaque objet dans Amazon S3 contient plusieurs enregistrements de film. Leur nombre dépend des paramètres du buffer de Data Firehose.

  • Ouvrez la console Athena console. Choisissez la base de données de votre choix et collez l’instruction DDL Hive suivante, en remplaçant LOCATION par votre compartiment S3 contenant les données de films. Si c’est la première fois que vous utilisez Athena, consultez Démarrer dans Athena – Guide de l’utilisateur et créez d’abord une de base de données d’exemple.
CREATE
 EXTERNAL 
TABLE
 
`
movies
`
(
    
`
year
`
 
int
,
    
`
createtime
`
 
int
,
    
`
title
`
 string
,
    
`
expiretime
`
 
int
,
    
`
info
`
 string
,
    
`
actor1
`
 string
,
    
`
actor2
`
 string
,
    
`
director1
`
 string
,
    
`
director2
`
 string
,
    
`
genre1
`
 string
,
    
`
genre2
`
 string
,
    
`
rating
`
 
double
)
 ROW
 FORMAT SERDE
    
'org.openx.data.jsonserde.JsonSerDe'
 
 LOCATION
    
's3://your-bucket-name/path/to/data/'

Vous pouvez maintenant interroger les données à partir de la console Athena. Par exemple, exécutez la requête suivante pour obtenir une note moyenne par genre1

ps: L’utilisation du format parquet (format colonne) pour les fichier contenu dans le bucket s3 pourrait être un axe d’optisation afin d’améliroer les performances de ces requêttes

SELECT
 genre1
,
 
avg
(
rating
)
 
as
 avg_rating 
FROM
 
"sampledb"
.
"movies"
 
group
 
by
 genre1 
order
 
by
 avg_rating 
desc
  • Ouvrez la console Amazon QuickSight. Si c’est la première fois que vous consultez Démarrer dans Amazon QuickSight – Guide de l’utilisateur. Choisissez Dataset puis New Dataset. Sur la page Create Dataset, choisissez Athena et fournissez un nom de source de données de votre choix (comme films par exemple) et choisissez Create Data Source. Vous pouvez en voir un exemple dans la capture d’écran suivante.

  • Sur la page Choose your table, illustrée ici, choisissez votre base de données et la table des films, puis choisissez Select.

  • Sur la page Finish dataset creation choisissez Directly query your data puis choisissez Visualize.

  • Vous créez maintenant une visualisation simple. Mettez le genre1 et actor1 sur l’axe Y et la rating (moyenne) sur l’axe X comme montré sur la capture d’écran suivante.

  • Vous pouvez maintenant voir les notes moyennes par genre1. Pour afficher les notes par actor1, choisissez Drama, puis choisissez Explorer vers actor1.

Le résultat montre la note moyenne par actor1 dans le genre1.

Conclusion

L’exemple de solution d’analyse et de visualisation de cet article montre comment exploiter les informations contenues dans les données de votre table DynamoDB. Dans cet article, vous avez créé un pipeline Big Data qui vous a permis de transférer rapidement les données de votre table DynamoDB vers un compartiment S3. Ensuite, vous effectuez des analyses avancées avec Athena et une visualisation avec Amazon QuickSight. Cette solution permet de copier toutes vos données DynamoDB vers Amazon S3. Néanmoins, vous pouvez également déplacer uniquement les enregistrements arrivés à expiration à l’aide de DynamoDB TTL. Ce type de solution découplée vous permet d’utiliser le service d’analyse optimal pour chaque étape du pipeline en fonction de considérations clés : latence, débit et coût.

Article original écrit par Roger Dahlstrom, Solutions Architect et Ilya Epshteyn, Principal Solutions Architect pour AWS et adapté en français par Thierry Valbusa, Senior Solutions Architect dans les équipes AWS France.