Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3

Chose que tu veux faire

Comme le titre l'indique, Redshift dispose d'un entrepôt de données, qui est généralement traité par ELT, mais il y a des cas où le traitement des données par programmation est nécessaire.

En utilisant UNLOAD de Redshift, vous pouvez créer un fichier gzip de Redshift vers S3 avec le résultat de SQL, il est donc dit qu'il sera traité par Lambda avec l'événement put sur S3 comme déclencheur et téléchargé à nouveau sur S3 dans l'état de gzip. J'ai essayé de faire ça.

UNLOAD Lambda dispose actuellement d'un maximum de 3008 Mo. Un tel traitement augmentera inévitablement la quantité de mémoire utilisée à mesure que la taille du fichier augmente. Par conséquent, ajustez la taille de fichier à transmettre à Lambda en définissant le paramètre MAXFILESIZE. C'est un cas par cas complet, mais cette fois je l'ai mis à 50 Mo.

Code sur Lambda

Les paramètres de déclenchement sont omis.

import json
import boto3
import urllib.parse
import os
import sys
import csv
import re
import traceback
import gzip
import subprocess

s3client = boto3.client('s3')
s3resource = boto3.resource('s3')
SEP = '\t'
L_SEP = '\n'
S3OUTBACKET='XXXXXXXX'
S3OUTBASE='athena/preprocessing/XXXXXXtmp/'

def lambda_handler(event, context):
    
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    taragetfile=os.path.split(key)[1]
    outputprefixA=os.path.split(key)[0].split("/")[-1]
    outputprefixB=os.path.split(key)[0].split("/")[-2]

    outputdata = "";
    try:
        dlfilename ='/tmp/'+key.replace("/","")
        s3client.download_file(bucket, key, dlfilename)
        gzipfile = gzip.open(dlfilename, 'rt') 
        csvreader = csv.reader(gzipfile, delimiter=SEP, lineterminator=L_SEP, quoting=csv.QUOTE_NONE)
        for line in csvreader:
            #Divers traitements sont effectués ligne par ligne et stockés dans les données de sortie.
            #Parmi les processus omis, il y a une importation qui est utilisée.
            #Notez s'il vous plaît
    except Exception as e:
        print(e)
        raise e
        
    print("memory size at outputdata:"+str(sys.getsizeof(outputdata)))
    os.remove(dlfilename)
    uploadbinary = gzip.compress(bytes(outputdata , 'utf-8'))
    print("memory size at uploadbinary:"+str(sys.getsizeof(uploadbinary)))
    uploadfilename='processed_'+taragetfile

    try:
        bucket = S3OUTBACKET
        key = S3OUTBASE+outputprefixA+"/"+outputprefixB+"/"+uploadfilename
        obj = s3resource.Object(bucket,key)
        obj.put( Body=uploadbinary ) 
    except Exception as e:
        print(e)
        raise e
 
    return 0

Régler

Lorsque je l'ai testé avec un fichier réel, j'ai eu une erreur de mémoire. Le str (sys.getsizeof (outputdata)) au milieu du code est pour confirmation, et j'ai saisi la situation en regardant la taille de la mémoire. Bien qu'il ne soit pas écrit dans le code, il est bon de voir le taux de compression de gzip lui-même par rapport aux données cibles. Les données que j'ai traitées cette fois-ci étaient de 50 Mo après la compression gzip, mais cela a pris 1000 Mo de mémoire pour les données traitées + les données compressées. Après tout, c'est quelque chose que vous ne pouvez pas comprendre à moins de l'essayer. Il peut être préférable d'étudier un peu plus la situation de la mémoire de Python.

Si vous augmentez la taille de la mémoire de Lambda, les ressources du processeur augmenteront également, donc cela dépend du contenu du traitement et de la taille du fichier, mais il est bon de vérifier à quelle vitesse le traitement sera une fois que le maximum est de 3008 Mo. Encore une fois, il y avait des cas où doubler la mémoire réduirait de moitié le temps de traitement.

Si le processus est effectué régulièrement, le réglage est ici très important car il est directement lié au coût de fonctionnement.

Impressions sans vocabulaire

Lambda très pratique

Recommended Posts

Traitez le fichier gzip UNLOADed avec Redshift avec Python de Lambda, gzipez-le à nouveau et téléchargez-le sur S3
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Le processus de création et d'amélioration du code Python orienté objet
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Convertissez le résultat de python optparse en dict et utilisez-le
Vérifier l'existence du fichier avec python
Connectez-vous à s3 avec AWS Lambda Python
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC
[Python] Résumé des opérations sur les fichiers S3 avec boto3
Exporter un instantané RDS vers S3 avec Lambda (Python)
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Convertir le code de caractère du fichier avec Python3
Conversion de Fourier du fichier wav lu par Python, conversion inverse et réécriture
Modèle de script python pour lire le contenu du fichier
Déterminer et traiter automatiquement l'encodage du fichier texte
Le processus d'installation d'Atom et de l'exécution de Python
J'ai essayé de toucher un fichier CSV avec Python
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Visualisez la gamme d'insertions internes et externes avec python
Je veux remplacer les variables dans le fichier de modèle python et le produire en masse dans un autre fichier
Lire le fichier json avec Python, le formater et générer le json
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
[Maintenance de l'environnement Python] De-NeoBundle. Préparez l'environnement du plug complémentaire super pratique jedi-vim avec dein et réglez-le pour qu'il soit confortable
POSTEZ l'image sélectionnée sur le site Web avec multipart / form-data et enregistrez-la sur Amazon S3! !!
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
C'était génial d'éditer le fichier Python dans Raspberry Pi avec la fonction à distance d'Atom
Comment insérer un processus spécifique au début et à la fin de l'araignée avec la tremblante
Comment obtenir les informations des organisations, Cost Explorer d'un autre compte AWS avec Lambda (python)
J'ai essayé de trouver l'entropie de l'image avec python
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Attacher au processus Python de la destination SSH et déboguer
Je veux connaître la nature de Python et pip
[Python] Exportez régulièrement de CloudWatch Logs vers S3 avec Lambda
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Vue d'ensemble de l'environnement virtuel Python et comment le créer
Récupérez la source de la page à charger indéfiniment avec python.
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
[Python] Qu'est-ce que pip? Expliquez la liste des commandes et comment l'utiliser avec des exemples réels
Lisez l'ancien fichier Word du formulaire d'application Gakushin DC (.doc) à partir de Python et essayez de le faire fonctionner
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
[Python scraping] Affiche l'URL et le titre du site contenant un mot-clé spécifique dans un fichier texte
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Traitez le contenu du fichier dans l'ordre avec un script shell
Activé pour convertir PNG en JPG avec Pillow of Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
[Python] Comment obtenir le premier et le dernier jour du mois