Acelerar crawls usando notificações de eventos do Amazon S3 - AWS Glue

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Acelerar crawls usando notificações de eventos do Amazon S3

Em vez de listar os objetos de um destino do Amazon S3 ou do Data Catalog, você pode configurar o crawler para usar eventos do Amazon S3 para localizar quaisquer alterações. Esse recurso melhora o tempo de recrawl usando eventos do Amazon S3 para identificar as alterações entre dois crawls listando todos os arquivos da subpasta que disparou o evento em vez de listar o destino completo do Amazon S3 ou do Data Catalog.

O primeiro crawl lista todos os objetos do Amazon S3 do destino. Após o primeiro crawling bem-sucedido, você pode optar pelo recrawling manualmente ou em um cronograma definido. O crawler listará apenas os objetos desses eventos em vez de listar todos os objetos.

As vantagens de migrar para um crawler baseado em eventos do Amazon S3 são:

  • Uma recuperação mais rápida, pois a listagem de todos os objetos do destino não é necessária, em vez disso, a listagem de pastas específicas é feita onde os objetos são adicionados ou excluídos.

  • Uma redução no custo geral de crawl à medida que a listagem de pastas específicas é feita onde os objetos são adicionados ou excluídos.

O crawl de eventos do Amazon S3 é executado consumindo eventos do Amazon S3 da fila SQS com base na programação do crawler. Não haverá custo se não houver eventos na fila. Os eventos do Amazon S3 podem ser configurados para ir diretamente para a fila SQS ou nos casos em que vários consumidores precisam do mesmo evento, uma combinação de SNS e SQS. Para obter mais informações, consulte Configurar sua conta para notificações de eventos do Amazon S3.

Depois de criar e configurar o crawler no modo de evento, o primeiro crawl é executado no modo de listagem fazendo uma listagem completa do destino do Amazon S3 ou do Data Catalog. O log a seguir confirma a operação do crawl consumindo eventos do Amazon S3 após o primeiro crawl bem-sucedido: "The crawl is running by consuming Amazon S3 events." (O crawl está sendo executado consumindo eventos do Amazon S3).

Depois de criar o crawl de eventos do Amazon S3 e atualizar as propriedades do crawler que podem afetar o crawl, o crawl opera no modo de lista e o seguinte log é adicionado: "Crawl is not running in S3 event mode" (O crawl não está sendo executado no modo de evento S3).

Destino: Catalog

Quando o destino é o Data Catalog, o crawler atualiza as tabelas existentes no Data Catalog com as alterações (por exemplo, partições extras em uma tabela).

Configurar sua conta para notificações de eventos do Amazon S3

Esta seção descreve como configurar sua conta para notificações de eventos do Amazon S3 e fornece instruções para fazer isso usando um script ou o console do AWS Glue.

Pré-requisitos

Complete as tarefas de configuração a seguir. Observe que os valores entre parênteses fazem referência às definições configuráveis do script.

  1. Crie um bucket do Amazon S3 (s3_bucket_name).

  2. Identificar um destino de crawler (folder_name, como "test1"), que é um caminho no bucket identificado.

  3. Preparar um nome de crawler (crawler_name)

  4. Preparar um nome de tópico do SNS (sns_topic_name) que poderia ser o mesmo que o nome do crawler.

  5. Preparar a região da AWS em que o crawler deve ser executado e o bucket do S3 existe (region).

  6. Opcionalmente, prepare um endereço de email se o email for usado para obter os eventos do Amazon S3 (subscribing_email).

Você também pode usar a pilha do CloudFormation para criar seus recursos. Execute as etapas a seguir.

  1. Iniciar a pilha do CloudFormation no Leste dos EUA (Norte da Virgínia):

  2. Em Parâmetros, insira um nome para o bucket do Amazon S3 (inclua o número da sua conta).

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

  4. Selecione Create stack.

Limitações:

  • O crawler só é compatível com um único destino, tanto para destinos do Amazon S3 quanto do Data Catalog.

  • Não há suporte para SQS na VPC privada.

  • Não há suporte para amostragem do Amazon S3.

  • O destino do crawler deve ser uma pasta para um destino do Amazon S3 ou uma ou mais tabelas do AWS Glue Data Catalog para um destino do Data Catalog.

  • Não há suporte para o curinga de caminho ‘everything’ (tudo): s3: //%

  • Para um destino do Data Catalog, todas as tabelas de catálogo devem apontar para o mesmo bucket do Amazon S3 para o modo de evento do Amazon S3.

  • Para um destino do Data Catalog, uma tabela de catálogo não deve apontar para uma localização no Amazon S3 no formato Delta Lake (contendo pastas _symlink ou conferindo o InputFormat da tabela do catálogo).

Para usar o crawler baseado em eventos do Amazon S3, você deve habilitar a notificação de eventos no bucket do S3 com eventos filtrados do prefixo que é o mesmo que o destino do S3 e armazenado no SQS. Você pode configurar o SQS e a notificação de eventos por meio do console seguindo as etapas em Passo a passo: configuração de um bucket para notificações ou usando oScript para gerar SQS e configurar eventos do Amazon S3 com base no destino.

Política de SQS

Adicione a seguinte política de SQS que é necessária para ser anexada à função usada pelo 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 para gerar SQS e configurar eventos do Amazon S3 com base no destino

Depois de garantir que os pré-requisitos sejam atendidos, você poderá executar o script Python a seguir para criar o SQS. Substitua as definições configuráveis pelos nomes preparados a partir dos pré-requisitos.

nota

Depois de executar o script, faça login no console do SQS para encontrar o ARN do SQS criado.

O Amazon SQS define um tempo limite de visibilidade, um período durante o qual o Amazon SQS impede que outros consumidores recebam e processem a mensagem. Defina o tempo limite de visibilidade aproximadamente igual ao runtime do crawl.

#!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.')

Configurar um crawler para fornecer notificações de eventos do Amazon S3 usando o console (destino do Amazon S3)

Para configurar um crawler para fornecer notificações de eventos do Amazon S3 usando o console do AWS Glue para um destino do Amazon S3:

  1. Defina as propriedades do crawler. Para obter mais informações, consulte Definir opções de configuração do crawler no console do AWS Glue.

  2. Na seção Configuração da fonte de dados, é perguntado a você se Os dados já estão mapeados para tabelas do AWS Glue?

    A opção Not yet (Ainda não) já estará selecionada por padrão. Isso ocorre porque você está usando uma fonte de dados do Amazon S3 e os dados ainda não estão mapeados para as tabelas do AWS Glue.

  3. Na seção Data sources (Fontes de dados), escolha Add a data source (Adicionar uma fonte de dados).

  4. No modal Add data source (Adicionar origem dos dados), configure a fonte de dados do Amazon S3:

    • Data source (Fonte de dados): o Amazon S3 é selecionado por padrão.

    • Network connection (Conexão de rede) (opcional): escolha Add new connection (Adicionar nova conexão).

    • Location of Amazon S3 data (Local de dados do Amazon S3): a opção In this account (Nesta conta) será selecionado por padrão.

    • Amazon S3 path (Caminho do Amazon S3): especifique o caminho do Amazon S3 no qual pastas e arquivos são rastreados.

    • Subsequent crawler runs (Execuções subsequentes do crawler): escolha Crawl based on events (Rastreamento baseado em eventos) para usar notificações de eventos do Amazon S3 para seu crawler.

    • Include SQS ARN (Incluir ARN de SQS): especifique os parâmetros do armazenamento de dados, incluindo um ARN válido do SQS. (Por exemplo, arn:aws:sqs:region:account:sqs).

    • Include dead-letter SQS ARN (Incluir ARN de mensagens não entregues do SQS) (opcional): especifique um ARN válido de mensagens não entregues do SQS na Amazon. (Por exemplo, arn:aws:sqs:region:account:deadLetterQueue).

    • Escolha Add an Amazon S3 data source (Adicionar uma fonte de dados do Amazon S3).

Configurar um crawler para notificações de eventos do Amazon S3 usando o console do AWS CLI

Veja a seguir um exemplo de chamada da AWS CLI do Amazon S3 para criar filas SQS e configurar notificações de eventos no bucket de destino do 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:

Configurar um crawler para fornecer notificações de eventos do Amazon S3 usando o console (destino do Data Catalog)

Quando você tiver um destino de catálogo, configure um crawler para fornecer notificações de eventos do Amazon S3 usando o console do AWS Glue:

  1. Defina as propriedades do crawler. Para obter mais informações, consulte Definir opções de configuração do crawler no console do AWS Glue.

  2. Na seção Configuração da fonte de dados, é perguntado a você se Os dados já estão mapeados para tabelas do AWS Glue?

    Selecione Yes (Sim) para selecionar as tabelas existentes do Data Catalog como fonte de dados.

  3. Na seção Glue tables (Tabelas do Glue), escolha Add tables (Adicionar tabelas).

  4. No modal Add table (Adicionar tabela), configure o banco de dados e as tabelas:

    • Network connection (Conexão de rede) (opcional): escolha Add new connection (Adicionar nova conexão).

    • Database (Banco de dados): selecione um banco de dados no Data Catalog.

    • Tables (Tabelas): selecione uma ou mais tabelas desse banco de dados no Data Catalog.

    • Subsequent crawler runs (Execuções subsequentes do crawler): escolha Crawl based on events (Rastreamento baseado em eventos) para usar notificações de eventos do Amazon S3 para seu crawler.

    • Include SQS ARN (Incluir ARN de SQS): especifique os parâmetros do armazenamento de dados, incluindo um ARN válido do SQS. (Por exemplo, arn:aws:sqs:region:account:sqs).

    • Include dead-letter SQS ARN (Incluir ARN de mensagens não entregues do SQS) (opcional): especifique um ARN válido de mensagens não entregues do SQS na Amazon. (Por exemplo, arn:aws:sqs:region:account:deadLetterQueue).

    • Selecione a opção Confirm (Confirmar).