Serverloze dataworkflow

Streaming data met AWS Kinesis en Lambda

Maksim Pecherskiy

Data Engineer

Even terugkijken

z8HRk.png

Streaming data met AWS Kinesis en Lambda

Huidige partitionering

FMktI.png

Streaming data met AWS Kinesis en Lambda

Speeders eruit filteren

IPwGK.png

Streaming data met AWS Kinesis en Lambda

Per dag aggregeren

tvBXx.png

Streaming data met AWS Kinesis en Lambda

recordReaderS3 openen

aIahM.png

Streaming data met AWS Kinesis en Lambda

recordReaderS3 bewerken

...
import pytz
from datetime import datetime
tz = pytz.timezone('America/Los_Angeles')
Streaming data met AWS Kinesis en Lambda

recordReaderS3 bewerken

def record_created_handler(event, context):

... ## Get top speeds that exceed the limit of 45 too_fast = top_speeds.loc[top_speeds.speed > SPEED_ALERT_THRESHOLD :]
## Generate object key fdate = datetime.now(tz).strftime("%Y%m%d/%HH%MM%SS") obj_key = f"speeders/{fdate}.csv" # filename in speeders folder
## Write the object to S3 s3.put_object(Bucket='sd-vehicle-data', Key=obj_key, Body=too_fast.to_csv(sep=" ", index=False) )
Streaming data met AWS Kinesis en Lambda

Speeders schrijven per datum en tijd

s3QY4.png

Streaming data met AWS Kinesis en Lambda

speederAggregator

tvBXx.png

Streaming data met AWS Kinesis en Lambda

speederAggregator maken

3pGYX.png

Streaming data met AWS Kinesis en Lambda

AWS Data Wrangler-laag toevoegen

7TO0V.png

Streaming data met AWS Kinesis en Lambda

speederAggregator-resources

sO0op.png

Streaming data met AWS Kinesis en Lambda

De getimede trigger maken

4Qi4i.png

Streaming data met AWS Kinesis en Lambda

y0FkQ.png

cron(50 6 * * ? *)
  • Op minuut 50
  • Van het 6e uur (UTC)
  • Elke dag van de maand
  • Elke maand
  • Elke dag van de week
  • Elk jaar
Streaming data met AWS Kinesis en Lambda

speederAggregator-callback

import boto3, pytz, pandas as pd

s3 = boto3.client("s3" ...)
...

def speeder_aggregator(event, context): tz = pytz.timezone('America/Los_Angeles') filter_date = datetime.now(tz).strftime("%Y%m%d")
Streaming data met AWS Kinesis en Lambda

speederAggregator-callback

def speeder_aggregator(event, context):
  ...
  objects = s3.list_objects_v2(
      Bucket='sd-vehicle-data', Prefix=f'speeders/{filter_date}')
  day_data = []

for obj in objects['Contents']: print(obj['Key']) day_record = s3.get_object(Bucket='sd-vehicle-data', Key = obj['Key']) day_data.append( pd.read_csv(day_record['Body'], delimiter = " ")) # Concatenate new records into a single dataframe. data = pd.concat(day_data) data.columns = ["record_id", "timestamp", "vin", "lon", "lat", "speed"]
Streaming data met AWS Kinesis en Lambda

awswrangler-pakket

import awswrangler as wr

session = boto3.Session(aws_access_key_id = AWS_KEY, aws_secret_access_key = AWS_SECRET, region_name="us-east-1")
df = wr.s3.read_csv(f"s3://sd-vehicle-data/speeders/{filter_date}") df.head()
Streaming data met AWS Kinesis en Lambda

Oude manier vs awswrangler

def speeder_aggregator(event, context):
  ...
  objects = s3.list_objects_v2(
      Bucket='sd-vehicle-data', Prefix=f'speeders/{filter_date}')
  day_data = []

  for obj in objects['Contents']:
      print(obj['Key'])
      day_record = s3.get_object(Bucket='sd-vehicle-data', Key = obj['Key'])
      day_data.append(
          pd.read_csv(day_record['Body'], delimiter = " "))

  # Concatenate new records into a single dataframe.
  data = pd.concat(day_data)
  data.columns = ["record_id", "timestamp", "vin", "lon", "lat", "speed"]
Streaming data met AWS Kinesis en Lambda

Oude manier vs awswrangler

import awswrangler as wr

session = boto3.Session(aws_access_key_id = AWS_KEY, 
                        aws_secret_access_key = AWS_SECRET, region_name="us-east-1")
def speeder_aggregator(event, context):
    df = wr.s3.read_csv(f"s3://sd-vehicle-data/speeders/{filter_date}")      
    df.head()
Streaming data met AWS Kinesis en Lambda

Samengevoegd speeders-bestand schrijven

wr.s3.to_csv(df, 
             f"s3://sd-vehicle-data/speeders_daily/{filter_date}.csv", 
             boto3_session=session, 
             sep=" ", index=False)
Streaming data met AWS Kinesis en Lambda

Opslaan en testen

agF2b.png

Streaming data met AWS Kinesis en Lambda

Trigger inschakelen

COfYY.png

Streaming data met AWS Kinesis en Lambda

Herhaling

u1Jwm.png

Streaming data met AWS Kinesis en Lambda

Herhaling

7ZYPV.png

Streaming data met AWS Kinesis en Lambda

Herhaling

  • Cron voor plannen
  • wr.s3.read_csv()
  • wr.s3.write_csv()
Streaming data met AWS Kinesis en Lambda

Laten we oefenen!

Streaming data met AWS Kinesis en Lambda

Preparing Video For Download...