Accelerazione del crawling con le notifiche eventi Amazon S3 - AWS Glue

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Accelerazione del crawling con le notifiche eventi Amazon S3

Invece di elencare gli oggetti da una destinazione Amazon S3 o catalogo dati, puoi configurare il crawler in modo che utilizzi gli eventi Amazon S3 per trovare eventuali modifiche. Questa caratteristica migliora il tempo di recupero utilizzando gli eventi Amazon S3 per identificare le modifiche tra due ricerche per indicizzazione elencando tutti i file della sottocartella che ha attivato l'evento invece che elencare l'intera destinazione Amazon S3 o catalogo dati.

Il primo crawling elenca tutti gli oggetti Amazon S3 dalla destinazione. Dopo il primo crawling riuscito, è possibile scegliere di effettuare una ricerca manualmente o in base a una pianificazione prestabilita. Il crawler elencherà solo gli oggetti di tali eventi invece di elencare tutti gli oggetti.

I vantaggi di passare a un crawler basato su eventi Amazon S3 sono:

  • Non è necessario un nuovo crawling più rapido, poiché non è necessario l'elenco di tutti gli oggetti della destinazione, invece l'elenco di cartelle specifiche viene eseguito dove gli oggetti vengono aggiunti o eliminati.

  • Si ha una riduzione del costo complessivo del crawling man mano che vengono elencate le cartelle specifiche nelle quali gli oggetti vengono aggiunti o eliminati.

La scansione degli eventi di Amazon S3 viene eseguita consumando gli eventi Amazon S3 dalla SQS coda in base alla pianificazione del crawler. Non ci saranno costi se non ci sono eventi nella coda. Gli eventi di Amazon S3 possono essere configurati per passare direttamente alla SQS coda o, nei casi in cui più consumatori necessitano dello stesso evento, una combinazione di e. SNS SQS Per ulteriori informazioni, consulta Configurazione dell'account per le notifiche degli eventi di Amazon S3.

Dopo aver creato e configurato il crawler in modalità evento, il primo crawling viene eseguito in modalità elenco eseguendo un elenco completo della destinazione Amazon S3 o catalogo dati. Il seguente log conferma il funzionamento del crawling consumando gli eventi Amazon S3 dopo la prima scansione riuscita: "il crawling è in esecuzione consumando eventi Amazon S3".

Dopo aver creato la ricerca per indicizzazione degli eventi Amazon S3 e aver aggiornato le proprietà del crawler che potrebbero influire sul crawling, quest'ultima funziona in modalità elenco e viene aggiunto il seguente log: "Il crawling non è in esecuzione in modalità evento S3".

Nota

Il numero massimo di messaggi da utilizzare è di 10.000 messaggi per scansione.

Destinazione catalogo

Quando la destinazione è il catalogo dati, il crawler aggiorna le tabelle esistenti al suo interno con le modifiche (ad esempio, partizioni aggiuntive in una tabella).

Configurazione dell'account per le notifiche degli eventi di Amazon S3

Questa sezione descrive come configurare il tuo account per le notifiche degli eventi di Amazon S3 e fornisce istruzioni per farlo utilizzando uno script o la AWS Glue console.

Prerequisiti

Completa i seguenti processi di configurazione. Nota che i valori tra parentesi fanno riferimento alle impostazioni configurabili dello script.

  1. Crea un bucket Amazon S3 (s3_bucket_name).

  2. Identifica un crawler di destinazione (folder_name, come "test1") che sia un percorso nel bucket identificato.

  3. Prepara un nome per il crawler (crawler_name)

  4. Prepara un nome per l'SNSargomento (sns_topic_name) che potrebbe essere lo stesso del nome del crawler.

  5. Prepara la AWS regione in cui deve essere eseguito il crawler e in cui esiste il bucket S3 (). region

  6. Facoltativamente, se utilizzi l'e-mail per ricevere gli eventi Amazon S3 (subscribing_email), prepara un indirizzo e-mail.

Puoi anche usare lo CloudFormation stack per creare le tue risorse. Completa questa procedura:

  1. Lancia il tuo CloudFormation stack negli Stati Uniti orientali (Virginia settentrionale):

  2. In Parametri, inserisci un nome per il bucket Amazon S3 (includendo il numero di account).

  3. Seleziona I acknowledge that AWS CloudFormation might create IAM resources with custom names.

  4. Scegli Create stack.

Restrizioni:

  • Il crawler di destinazione ne supporta una sola, sia per quanto riguarda le destinazioni Amazon S3 che per le destinazioni Amazon S3.

  • SQSon private non VPC è supportato.

  • Il campionamento Amazon S3 non è supportato.

  • La destinazione del crawler deve essere una cartella per una destinazione Amazon S3 o una o più tabelle di catalogo dati di AWS Glue per una destinazione catalogo dati.

  • Il carattere jolly del percorso “tutto” non è supportato: s3: //%

  • Per una destinazione catalogo dati, tutte le tabelle del catalogo devono puntare allo stesso bucket Amazon S3 per la modalità evento di Amazon S3.

  • Per una destinazione catalogo dati, una tabella di catalogo non deve indicare una posizione Amazon S3 nel formato Delta Lake (contenente cartelle _symlink o controllando le tabelle del catalogo InputFormat).

Per utilizzare il crawler basato sugli eventi di Amazon S3, devi abilitare la notifica degli eventi sul bucket S3 con gli eventi filtrati dal prefisso che è lo stesso della destinazione S3 e archiviati in. SQS Puoi configurare SQS una notifica di eventi tramite la console seguendo la procedura descritta nella procedura dettagliata: Configurazione di un bucket per le notifiche o utilizzo di. Script per generare SQS e configurare eventi Amazon S3 dalla destinazione

SQSpolitica

Aggiungi la seguente SQS politica che deve essere associata al ruolo utilizzato dal crawler.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:GetQueueUrl", "sqs:ListDeadLetterSourceQueues", "sqs:ReceiveMessage", "sqs:GetQueueAttributes", "sqs:ListQueueTags", "sqs:SetQueueAttributes", "sqs:PurgeQueue" ], "Resource": "arn:aws:sqs:{region}:{accountID}:cfn-sqs-queue" } ] }

Script per generare SQS e configurare eventi Amazon S3 dalla destinazione

Dopo esserti assicurato che i prerequisiti siano soddisfatti, puoi eseguire il seguente script Python per creare il. SQS Sostituisci le impostazioni configurabili con i nomi preparati dai prerequisiti.

Nota

Dopo aver eseguito lo script, accedi alla SQS console per trovare quello ARN creato. SQS

Amazon SQS imposta un timeout di visibilità, un periodo di tempo durante il quale Amazon SQS impedisce ad altri consumatori di ricevere ed elaborare il messaggio. Imposta il timeout visibilità con valore approssimativamente uguale al tempo di esecuzione del crawling.

#!venv/bin/python import boto3 import botocore #---------Start : READ ME FIRST ----------------------# # 1. Purpose of this script is to create the SQS, SNS and enable S3 bucket notification. # The following are the operations performed by the scripts: # a. Enable S3 bucket notification to trigger 's3:ObjectCreated:' and 's3:ObjectRemoved:' events. # b. Create SNS topic for fan out. # c. Create SQS queue for saving events which will be consumed by the crawler. # SQS Event Queue ARN will be used to create the crawler after running the script. # 2. This script does not create the crawler. # 3. SNS topic is created to support FAN out of S3 events. If S3 event is also used by another # purpose, SNS topic created by the script can be used. # 1. Creation of bucket is an optional step. # To create a bucket set create_bucket variable to true. # 2. The purpose of crawler_name is to easily locate the SQS/SNS. # crawler_name is used to create SQS and SNS with the same name as crawler. # 3. 'folder_name' is the target of crawl inside the specified bucket 's3_bucket_name' # #---------End : READ ME FIRST ------------------------# #--------------------------------# # Start : Configurable settings # #--------------------------------# #Create region = 'us-west-2' s3_bucket_name = 's3eventtestuswest2' folder_name = "test" crawler_name = "test33S3Event" sns_topic_name = crawler_name sqs_queue_name = sns_topic_name create_bucket = False #-------------------------------# # End : Configurable settings # #-------------------------------# # Define aws clients dev = boto3.session.Session(profile_name='myprofile') boto3.setup_default_session(profile_name='myprofile') s3 = boto3.resource('s3', region_name=region) sns = boto3.client('sns', region_name=region) sqs = boto3.client('sqs', region_name=region) client = boto3.client("sts") account_id = client.get_caller_identity()["Account"] queue_arn = "" def print_error(e): print(e.message + ' RequestId: ' + e.response['ResponseMetadata']['RequestId']) def create_s3_bucket(bucket_name, client): bucket = client.Bucket(bucket_name) try: if not create_bucket: return True response = bucket.create( ACL='private', CreateBucketConfiguration={ 'LocationConstraint': region }, ) return True except botocore.exceptions.ClientError as e: print_error(e) if 'BucketAlreadyOwnedByYou' in e.message: # we own this bucket so continue print('We own the bucket already. Lets continue...') return True return False def create_s3_bucket_folder(bucket_name, client, directory_name): s3.put_object(Bucket=bucket_name, Key=(directory_name + '/')) def set_s3_notification_sns(bucket_name, client, topic_arn): bucket_notification = client.BucketNotification(bucket_name) try: response = bucket_notification.put( NotificationConfiguration={ 'TopicConfigurations': [ { 'Id' : crawler_name, 'TopicArn': topic_arn, 'Events': [ 's3:ObjectCreated:*', 's3:ObjectRemoved:*', ], 'Filter' : {'Key': {'FilterRules': [{'Name': 'prefix', 'Value': folder_name}]}} }, ] } ) return True except botocore.exceptions.ClientError as e: print_error(e) return False def create_sns_topic(topic_name, client): try: response = client.create_topic( Name=topic_name ) return response['TopicArn'] except botocore.exceptions.ClientError as e: print_error(e) return None def set_sns_topic_policy(topic_arn, client, bucket_name): try: response = client.set_topic_attributes( TopicArn=topic_arn, AttributeName='Policy', AttributeValue='''{ "Version": "2008-10-17", "Id": "s3-publish-to-sns", "Statement": [{ "Effect": "Allow", "Principal": { "AWS" : "*" }, "Action": [ "SNS:Publish" ], "Resource": "%s", "Condition": { "StringEquals": { "AWS:SourceAccount": "%s" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:%s" } } }] }''' % (topic_arn, account_id, bucket_name) ) return True except botocore.exceptions.ClientError as e: print_error(e) return False def subscribe_to_sns_topic(topic_arn, client, protocol, endpoint): try: response = client.subscribe( TopicArn=topic_arn, Protocol=protocol, Endpoint=endpoint ) return response['SubscriptionArn'] except botocore.exceptions.ClientError as e: print_error(e) return None def create_sqs_queue(queue_name, client): try: response = client.create_queue( QueueName=queue_name, ) return response['QueueUrl'] except botocore.exceptions.ClientError as e: print_error(e) return None def get_sqs_queue_arn(queue_url, client): try: response = client.get_queue_attributes( QueueUrl=queue_url, AttributeNames=[ 'QueueArn', ] ) return response['Attributes']['QueueArn'] except botocore.exceptions.ClientError as e: print_error(e) return None def set_sqs_policy(queue_url, queue_arn, client, topic_arn): try: response = client.set_queue_attributes( QueueUrl=queue_url, Attributes={ 'Policy': '''{ "Version": "2012-10-17", "Id": "AllowSNSPublish", "Statement": [ { "Sid": "AllowSNSPublish01", "Effect": "Allow", "Principal": "*", "Action": "SQS:SendMessage", "Resource": "%s", "Condition": { "ArnEquals": { "aws:SourceArn": "%s" } } } ] }''' % (queue_arn, topic_arn) } ) return True except botocore.exceptions.ClientError as e: print_error(e) return False if __name__ == "__main__": print('Creating S3 bucket %s.' % s3_bucket_name) if create_s3_bucket(s3_bucket_name, s3): print('\nCreating SNS topic %s.' % sns_topic_name) topic_arn = create_sns_topic(sns_topic_name, sns) if topic_arn: print('SNS topic created successfully: %s' % topic_arn) print('Creating SQS queue %s' % sqs_queue_name) queue_url = create_sqs_queue(sqs_queue_name, sqs) if queue_url is not None: print('Subscribing sqs queue with sns.') queue_arn = get_sqs_queue_arn(queue_url, sqs) if queue_arn is not None: if set_sqs_policy(queue_url, queue_arn, sqs, topic_arn): print('Successfully configured queue policy.') subscription_arn = subscribe_to_sns_topic(topic_arn, sns, 'sqs', queue_arn) if subscription_arn is not None: if 'pending confirmation' in subscription_arn: print('Please confirm SNS subscription by visiting the subscribe URL.') else: print('Successfully subscribed SQS queue: ' + queue_arn) else: print('Failed to subscribe SNS') else: print('Failed to set queue policy.') else: print("Failed to get queue arn for %s" % queue_url) # ------------ End subscriptions to SNS topic ----------------- print('\nSetting topic policy to allow s3 bucket %s to publish.' % s3_bucket_name) if set_sns_topic_policy(topic_arn, sns, s3_bucket_name): print('SNS topic policy added successfully.') if set_s3_notification_sns(s3_bucket_name, s3, topic_arn): print('Successfully configured event for S3 bucket %s' % s3_bucket_name) print('Create S3 Event Crawler using SQS ARN %s' % queue_arn) else: print('Failed to configure S3 bucket notification.') else: print('Failed to add SNS topic policy.') else: print('Failed to create SNS topic.')

Configurazione di un crawler per le notifiche degli eventi Amazon S3 tramite la console (destinazione Amazon S3)

Configurare un crawler per le notifiche eventi Amazon S3 utilizzando la console AWS Glue per una destinazione Amazon S3:

  1. Imposta le proprietà del crawler. Per ulteriori informazioni, consulta la pagina Impostazione delle opzioni di configurazione del crawler nella console AWS Glue.

  2. Nella sezione Data source configuration (Configurazione origine dei dati) viene chiesto Is your data already mapped to AWS Glue tables? .

    Per impostazione predefinita, la risposta Not yet (Non ancora) è già selezionata. Lascia questa impostazione come predefinita poiché stai utilizzando un'origine dei dati Amazon S3 e i dati non sono ancora mappati su tabelle AWS Glue.

  3. Nella sezione Data sources (Origini dei dati), scegli Add a data source (Aggiungi un'origine dei dati).

    Data source configuration interface with options to select or add data sources for crawling.
  4. Nella modalità Add data source (Aggiungi origine dei dati), configura l'origine dati di Amazon S3:

    • Data source (Origine dei dati): per impostazione predefinita, è selezionato Amazon S3.

    • Network connection (Connessione di rete) (Facoltativo): seleziona Add new connection (Aggiungi una nuova connessione).

    • Location of Amazon S3 data (Posizione dei dati Amazon S3): per impostazione predefinita, è selezionata l'opzione In this account (In questo account).

    • Amazon S3 path (Percorso Amazon S3): specifica il percorso Amazon S3 in cui effettuare il crawling in cartelle e file.

    • Subsequent crawler runs (Esecuzione successiva del crawler): seleziona Crawl based on events (Crawling in base agli eventi) per utilizzare le notifiche degli eventi di Amazon S3 per il crawler.

    • Includi SQS ARN: specifica i parametri del data store, inclusi quelli validi SQSARN. Ad esempio, arn:aws:sqs:region:account:sqs.

    • Includi lettera morta SQS ARN (facoltativo): specifica una lettera non valida per Amazon. SQS ARN Ad esempio, arn:aws:sqs:region:account:deadLetterQueue.

    • Scegli Add an Amazon S3 data source (Aggiungi un'origine dei dati Amazon S3).

    Add data source dialog for S3, showing options for network connection and crawl settings.

Configurazione di un crawler per le notifiche degli eventi di Amazon S3 utilizzando il AWS CLI

Di seguito è riportato un esempio di AWS CLI chiamata Amazon S3 per creare SQS code e configurare notifiche di eventi sul bucket di destinazione Amazon S3.

S3 Event AWS CLI aws sqs create-queue --queue-name MyQueue --attributes file://create-queue.json create-queue.json ``` { "Policy": { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SQS:SendMessage" ], "Resource": "SQS-queue-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:awsexamplebucket1" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] } } ``` aws s3api put-bucket-notification-configuration --bucket customer-data-pdx --notification-configuration file://s3-event-config.json s3-event-config.json ``` { "QueueConfigurations": [ { "Id": "s3event-sqs-queue", "QueueArn": "arn:aws:sqs:{region}:{account}:queuename", "Events": [ "s3:ObjectCreated:*", "s3:ObjectRemoved:*" ], "Filter": { "Key": { "FilterRules": [ { "Name": "Prefix", "Value": "/json" } ] } } } ] } ``` Create Crawler:

Configurazione di un crawler per le notifiche degli eventi Amazon S3 tramite la console (destinazione catalogo dati)

In presenza di una destinazione catalogo, configurare un crawler per le notifiche eventi Amazon S3 utilizzando la console AWS Glue:

  1. Imposta le proprietà del crawler. Per ulteriori informazioni, consulta la pagina Impostazione delle opzioni di configurazione del crawler nella console AWS Glue.

  2. Nella sezione Data source configuration (Configurazione origine dei dati) viene chiesto Is your data already mapped to AWS Glue tables? .

    Seleziona Yes (Sì) per selezionare le tabelle esistenti dal catalogo dati come origine dati.

  3. Nella sezione Glue tables, (tabelle Glue) scegli Add tables (aggiungi tabelle).

    Data source configuration interface with options to select existing Glue tables or add new ones.
  4. Nella modalità Add table (aggiungi tabella), configura il database e le tabelle:

    • Network connection (Connessione di rete) (Facoltativo): seleziona Add new connection (Aggiungi una nuova connessione).

    • Database: selezionare un database nel catalogo dati.

    • Tabelle: seleziona una o più tabelle da quel database nel catalogo dati.

    • Subsequent crawler runs (Esecuzione successiva del crawler): seleziona Crawl based on events (Crawling in base agli eventi) per utilizzare le notifiche degli eventi di Amazon S3 per il crawler.

    • Include SQS ARN: specifica i parametri del data store, inclusi quelli validi. SQS ARN Ad esempio, arn:aws:sqs:region:account:sqs.

    • Includi lettera morta SQS ARN (facoltativo): specifica una lettera non valida per Amazon. SQS ARN Ad esempio, arn:aws:sqs:region:account:deadLetterQueue.

    • Scegli Conferma.

    Add Glue tables dialog with network, database, tables, and crawler options.