Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch

Was du machen willst

Wie der Titel schon sagt, verfügt Redshift über ein Data Warehouse, das normalerweise von ELT verarbeitet wird. In einigen Fällen ist jedoch eine Datenverarbeitung durch Programmierung erforderlich.

Mit UNLOAD von Redshift können Sie eine gzip-Datei von Redshift nach S3 mit dem Ergebnis von SQL erstellen. Es wird also gesagt, dass sie von Lambda mit dem put-Ereignis in S3 als Trigger verarbeitet und im Status von gzip erneut in S3 hochgeladen wird. Das habe ich versucht.

UNLOAD Lambda hat derzeit maximal 3008 MB. Eine solche Verarbeitung erhöht zwangsläufig den Speicherbedarf mit zunehmender Dateigröße. Passen Sie daher die an Lambda übergebene Dateigröße an, indem Sie den Parameter [MAXFILESIZE] festlegen (https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html). Es ist von Fall zu Fall vollständig, aber dieses Mal habe ich es auf 50 MB eingestellt.

Code auf Lambda

Triggereinstellungen werden weggelassen.

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:
            #Verschiedene Verarbeitungen werden zeilenweise durchgeführt und in Ausgabedaten gespeichert.
            #Unter den ausgelassenen Prozessen wird ein Import verwendet.
            #bitte beachten Sie
    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

Melodie

Als ich es mit einer tatsächlichen Datei getestet habe, ist ein Speicherfehler aufgetreten. Das str (sys.getsizeof (outputdata)) in der Mitte des Codes dient zur Bestätigung, und ich habe die Situation anhand der Speichergröße erfasst. Obwohl es nicht im Code geschrieben ist, ist es gut, das Komprimierungsverhältnis von gzip selbst zu den Zieldaten zu sehen. Die Daten, die ich dieses Mal verarbeitet habe, waren 50 MB nach der gzip-Komprimierung, aber es wurden 1000 MB Speicher für die verarbeiteten Daten + die komprimierten Daten benötigt. Schließlich ist es etwas, das Sie nicht verstehen können, wenn Sie es nicht tatsächlich versuchen. Es ist möglicherweise besser, die Speichersituation von Python etwas genauer zu untersuchen.

Wenn Sie die Speichergröße von Lambda erhöhen, erhöhen sich auch die CPU-Ressourcen. Dies hängt vom Verarbeitungsinhalt und der Dateigröße ab. Überprüfen Sie jedoch, wie schnell die Verarbeitung sein wird, sobald das Maximum 3008 MB beträgt. Wieder gab es Fälle, in denen eine Verdoppelung des Speichers die Verarbeitungszeit halbierte.

Wenn der Prozess regelmäßig durchgeführt wird, ist die Optimierung hier sehr wichtig, da sie direkt mit den laufenden Kosten zusammenhängt.

Impressionen ohne Wortschatz

Lambda sehr praktisch

Recommended Posts

Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch
[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
Überprüfen Sie die Existenz der Datei mit Python
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Konvertieren Sie eine Tabelle in CSV und laden Sie sie mit Cloud-Funktionen in den Cloud-Speicher hoch
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
Lesen Sie die Daten des NFC-Lesegeräts, das mit Python an Raspberry Pi 3 angeschlossen ist, und senden Sie sie mit OSC an openFrameworks
[Python] Zusammenfassung der S3-Dateivorgänge mit boto3
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Konvertieren Sie den Zeichencode der Datei mit Python3
Fourier-Konvertierung der von Python gelesenen WAV-Datei, umgekehrte Konvertierung und erneutes Schreiben
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Ermitteln und verarbeiten Sie die Codierung der Textdatei automatisch
Der Prozess der Installation von Atom und der Ausführung von Python
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Ich möchte die Variablen in der Python-Vorlagendatei ersetzen und in einer anderen Datei in Massenproduktion herstellen
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
[Wartung der Python-Umgebung] De-NeoBundle. Bereiten Sie die Umgebung des super praktischen Komplementärsteckers jedi-vim mit dein vor und stellen Sie ihn so ein, dass er bequem ist
POST das ausgewählte Bild auf der Website mit mehrteiligen / Formulardaten und speichere es in Amazon S3! !!
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Es war großartig, die Python-Datei in Raspberry Pi mit der Remote-Funktion von Atom zu bearbeiten
Wie man einen bestimmten Prozess am Anfang und Ende der Spinne mit Scrapy einfügt
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Anhängen an den Python-Prozess des SSH-Ziels und Debuggen
Ich möchte die Natur von Python und Pip kennenlernen
[Python] Exportieren Sie regelmäßig mit Lambda aus CloudWatch-Protokollen nach S3
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python
Übersicht über die virtuelle Python-Umgebung und deren Erstellung
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
[Python] Was ist Pip? Erläutern Sie die Befehlsliste und deren Verwendung anhand aktueller Beispiele
Lesen Sie das alte Gakushin DC-Antragsformular Word-Datei (.doc) von Python und versuchen Sie, es zu bedienen
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
[Python-Scraping] Geben Sie die URL und den Titel der Site mit einem bestimmten Schlüsselwort in eine Textdatei ein
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Aktiviert, um PNG mit Pillow of Python in JPG zu konvertieren
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
[Python] So erhalten Sie den ersten und den letzten Tag des Monats