web-dev-qa-db-fra.com

Paramètres d'entrée du travail AWS Glue

Je suis relativement nouveau sur AWS et cela peut être une question un peu moins technique, mais actuellement AWS Glue note qu'un maximum de 25 emplois peuvent être créés. Nous chargeons une série de tableaux qui ont chacun leur propre travail qui ajoute ensuite des colonnes d'audit. Chaque travail est très similaire, mais modifie simplement la source et la cible de la chaîne de connexion.

Existe-t-il un moyen de paramétrer ces travaux pour permettre leur réutilisation et simplement leur transmettre les chaînes de connexion appropriées? Ou peut-être même parcourir une chaîne de connexion définie dans un travail maître qui appelle un travail enfant en passant par les différentes chaînes de connexion?

Tout exemple ou documentation serait le plus apprécié

5
Sauron

Dans l'exemple ci-dessous, je présente comment utiliser les paramètres d'entrée de travail Glue dans le code. Ce code prend les paramètres d'entrée et les écrit dans le fichier plat.

1) Définition des paramètres d'entrée dans la configuration du travail.

enter image description here

2) Le code du travail de colle

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
args = getResolvedOptions(sys.argv, ['JOB_NAME','VAL1','VAL2','VAL3','DEST_FOLDER'])
job.init(args['JOB_NAME'], args)

v_list=[{"VAL1":args['VAL1'],"VAL2":args['VAL2'],"VAL3":args['VAL3']}]

df=sc.parallelize(v_list).toDF()
df.repartition(1).write.mode('overwrite').format('csv').options(header=True, delimiter = ';').save("s3://"+ args['DEST_FOLDER'] +"/")

job.commit()

3) Il est également possible de fournir des paramètres d'entrée lors de l'utilisation de boto3, CloudFormation ou StepFunctions. Cet exemple montre comment le faire en utilisant boto3.

import boto3

def lambda_handler(event, context):
    glue = boto3.client('glue')


    myJob = glue.create_job(Name='example_job2', Role='AWSGlueServiceDefaultRole',
                            Command={'Name': 'glueetl','ScriptLocation': 's3://aws-glue-scripts/example_job'},
                            DefaultArguments={"VAL1":"value1","VAL2":"value2","VAL3":"value3"}       
                                   )

    glue.start_job_run(JobName=myJob['Name'], Arguments={"VAL1":"value11","VAL2":"value22","VAL3":"value33"})

Liens utiles:

  1. https://docs.aws.Amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-get-resolved-options.html
  2. https://docs.aws.Amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html
  3. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html#Glue.Client.create_job
  4. https://docs.aws.Amazon.com/step-functions/latest/dg/connectors-glue.html
8
j.b.gorski