web-dev-qa-db-fra.com

Comment faire en sorte que MSCK REPAIR TABLE s'exécute automatiquement dans AWS Athena

J'ai un travail par lots d'allumage qui est exécuté toutes les heures. Chaque exécution génère et stocke de nouvelles données dans S3 avec le modèle de nommage de répertoire DATA/YEAR=?/MONTH=?/DATE=?/datafile

Après avoir téléchargé les données dans S3, je souhaite les analyser à l'aide de Athena. De plus, j'aimerais les visualiser dans QuickSight en me connectant à Athena en tant que source de données. 

Le problème est que, après chaque exécution de mon lot Spark, les données nouvellement générées stockées dans S3 ne seront pas découvertes par Athena, sauf si je lance manuellement la requête MSCK REPARI TABLE.

Existe-t-il un moyen d'obliger Athena à mettre à jour les données automatiquement, afin que je puisse créer un pipeline entièrement automatique de visualisation des données?

10
YangZhao

Il existe plusieurs façons de planifier cette tâche. Comment planifiez-vous vos flux de travail? Utilisez-vous un système tel que Airflow , Luigi , Azkaban , cron ou utilisez un AWS Data pipeline ?

À partir de ces éléments, vous devriez pouvoir lancer la commande CLI suivante.

$ aws athena start-query-execution --query-string "MSCK REPAIR TABLE some_database.some_table" --result-configuration "OutputLocation=s3://SOMEPLACE"

Une autre option serait AWS Lambda . Vous pourriez avoir une fonction qui appelle MSCK REPAIR TABLE some_database.some_table en réponse à un nouveau téléchargement sur S3. 

Un exemple de fonction Lambda pourrait être écrit en tant que tel:

import boto3

def lambda_handler(event, context):
    bucket_name = 'some_bucket'

    client = boto3.client('athena')

    config = {
        'OutputLocation': 's3://' + bucket_name + '/',
        'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}

    }

    # Query Execution Parameters
    sql = 'MSCK REPAIR TABLE some_database.some_table'
    context = {'Database': 'some_database'}

    client.start_query_execution(QueryString = sql, 
                                 QueryExecutionContext = context,
                                 ResultConfiguration = config)

Vous devez ensuite configurer un déclencheur pour exécuter votre fonction Lambda lorsque de nouvelles données sont ajoutées sous le préfixe DATA/ dans votre compartiment.

En fin de compte, la reconstruction explicite des partitions après l'exécution de votre tâche Spark à l'aide d'un planificateur de tâches présente l'avantage d'être auto-documentée. Par ailleurs, AWS Lambda est pratique pour des tâches telles que celle-ci. 

10
Zerodf

Vous devriez exécuter ADD PARTITION à la place:

aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."

Ce qui ajoute une partition récemment créée à partir de votre emplacement S3 Athena utilise Hive pour partitionner les données . Pour créer une table avec des partitions, vous devez la définir lors de l’instruction CREATE TABLE. Utilisez PARTITIONED BY pour définir les clés permettant de partitionner les données.

0
Tony Marti