View a markdown version of this page

Esecuzione di un'operazione di invio in blocco di articoli - Amazon DynamoDB

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à.

Esecuzione di un'operazione di invio in blocco di articoli

Fornisci una posizione Amazon S3 per i file di input e una tabella di destinazione. DynamoDB riporta gli elementi che non è stato in grado di scrivere in un bucket di output fornito. Puoi scegliere cosa contiene il report di output tramite OutputType parametro: richiesta ERROR per gli articoli che non sono stati convalidati, CONDITION_CHECK_FAILURE per gli articoli che non soddisfano le loro condizioni, o entrambe.

È possibile eseguire un'operazione di invio in blocco di articoli utilizzando AWS CLI o il AWS SDK. Per usare AWS CLI, installalo prima e configuralo con il tuo AWS credenziali. Per ulteriori informazioni, consulta Accesso a DynamoDB.

Nota

Non modificare gli oggetti Amazon S3 mentre l'operazione è in corso. La modifica degli oggetti di input può causare il fallimento dell'operazione.

Avvio di un'operazione di inserimento in blocco degli elementi

Per avviare un'operazione di invio in blocco di articoli, chiama StartBulkPutItems e fornisci i seguenti input richiesti:

Sono disponibili anche i seguenti parametri opzionali:

  • PerformanceTier — Scegli STANDARD (impostazione predefinita) o ACCELERATED. Lo standard si adatta alla maggior parte delle operazioni in cui i tempi di completamento sono flessibili. Accelerated è progettato per carichi di lavoro in cui i tempi di completamento sono più rigidi e mirano a una produttività più elevata rispetto a Standard, in modo che le operazioni di grandi dimensioni possano essere completate più velocemente. Per ulteriori informazioni, consulta Livelli di prestazioni.

  • MaxWriteRequestUnits — Nel contesto delle operazioni di massa, MaxWriteRequestUnits è il numero massimo di unità di richiesta di scrittura al secondo con cui è possibile scrivere l'operazione in blocco. Il limite si applica al totale delle unità di richiesta di scrittura che l'operazione consuma sulla tabella e su tutti i relativi indici. Ad esempio, in una tabella con due indici secondari globali che proiettano entrambi l'elemento, un limite di 1.024 consente circa 340 elementi da 1 KB al secondo. È da utilizzare se si eseguono operazioni a valle sensibili a velocità di scrittura più elevate. Questa impostazione si applica solo alle operazioni in blocco e non ha alcuna relazione con la capacità fornita o su richiesta della tabella. Il valore minimo è 1.024.

  • ClientToken — Un token di idempotenza. Se riprovi una richiesta con lo stesso token client, DynamoDB restituisce l'operazione esistente anziché crearne una nuova. DynamoDB conserva il token per 8 ore.

Formati di input supportati

InputFormat accetta i seguenti valori:

  • DYNAMODB_JSON

  • ION

InputCompressionType accetta i seguenti valori:

  • GZIP

  • ZSTD

  • NONE

Tipi di output

OutputType è un elenco e puoi richiedere uno o entrambi i seguenti tipi di report:

  • ERROR — Fornisce un report degli elementi che hanno avuto esito negativo per motivi deterministici, ad esempio errori di convalida.

  • CONDITION_CHECK_FAILURE — Fornisce un report degli elementi la cui espressione di condizione per elemento non è stata soddisfatta.

Avvio di un'operazione (AWS CLI)

L'esempio seguente avvia un'operazione di inserimento in blocco degli elementi che legge i file JSON di DynamoDB da un bucket Amazon S3 e invia il report in un bucket separato.

aws dynamodb start-bulk-put-items \ --table-name MusicCollection \ --input-s3-configuration '{ "S3Bucket": "amzn-s3-demo-bucket", "S3KeyPrefix": "daily/", "InputFormat": "DYNAMODB_JSON", "InputCompressionType": "NONE" }' \ --output-s3-configuration '{ "OutputType": ["ERROR"], "S3Bucket": "amzn-s3-demo-bucket1", "S3KeyPrefix": "bulk-put-items-output/" }' \ --performance-tier STANDARD

Avvio di un'operazione (Python)

L'esempio seguente utilizza AWS SDK per Python (Boto3) per avviare un'operazione di inserimento in blocco di elementi.

import boto3 client = boto3.client("dynamodb") response = client.start_bulk_put_items( TableName="MusicCollection", InputS3Configuration={ "S3Bucket": "amzn-s3-demo-bucket", "S3KeyPrefix": "daily/", "InputFormat": "DYNAMODB_JSON", "InputCompressionType": "NONE", }, OutputS3Configuration={ "S3Bucket": "amzn-s3-demo-bucket1", "OutputType": ["ERROR", "CONDITION_CHECK_FAILURE"], }, PerformanceTier="STANDARD", ) bulk_operation_arn = response["BulkOperationDescription"]["BulkOperationArn"] print(f"Started operation: {bulk_operation_arn}")

Monitoraggio dell'avanzamento

Chiama DescribeBulkOperation per monitorare lo stato di avanzamento di un'operazione di invio in blocco di articoli. Tre campi segnalano lo stato di avanzamento:

  • ProcessedItemCount — Il numero di record di input letti finora, inclusi i record che non hanno superato la convalida o il controllo delle condizioni. Si tratta del conteggio dei record letti, non degli elementi scritti.

  • ProcessedInputBytes — Il numero di byte letti ed elaborati finora da Amazon S3.

  • TotalInputBytes — La dimensione totale di tutti gli oggetti di input in Amazon S3.

Per stimare i progressi, confronta ProcessedInputBytes a TotalInputBytes. Ad esempio, se il tuo input ammonta a 50 GB e ProcessedInputBytes mostra 35 GB, l'operazione è completa all'incirca al 70 percento.

TotalInputBytes è assente dalla risposta finché DynamoDB non calcola il totale durante la convalida iniziale dell'input. Il tempo di calcolo varia in base alle condizioni operative e di servizio. Sondaggio DescribeBulkOperation finché il campo non è presente.

I campi di avanzamento si aggiornano periodicamente e possono essere aggiornati in momenti diversi. Non sono contatori attivi. Non fare affidamento su un intervallo di aggiornamento fisso.

Valori di stato

Il BulkOperationStatus il campo restituisce uno dei seguenti valori:

  • IN_PROGRESS — L'operazione consiste nella lettura di input e nella scrittura di elementi.

  • COMPLETED — Tutti gli input sono stati letti e FailedItemCount è 0. Gli articoli possono ancora non aver superato il controllo delle condizioni. Se lo hai richiesto, leggi il CONDITION_CHECK_FAILURE fai un rapporto per trovarli.

  • COMPLETED_WITH_ERRORS — Tutti gli input sono stati letti e FailedItemCount è superiore a 0. Rivedi il ERROR rapporto.

  • CANCELLING — Viene applicata una richiesta di cancellazione.

  • CANCELLED — L'operazione è stata interrotta in risposta a una richiesta di cancellazione. Gli elementi già scritti rimangono nella tabella. CANCELLED non significa che manchino dei dati. Il manifesto di completamento registra ciò che è stato elaborato. FailureCode è RequestCancelled.

  • FAILED — L'operazione non può essere completata. Vedi il codice di errore.

Se un'operazione supera il tempo massimo di elaborazione, DynamoDB interrompe l'ingestione e l'operazione termina FAILED con codice di errore Timeout e il messaggio «L'operazione in blocco ha superato il tempo di elaborazione massimo consentito». Il timeout è un risultato atteso per un input molto grande o per un'operazione la cui velocità è limitata MaxWriteRequestUnits, piuttosto che un guasto. Gli elementi già scritti rimangono nella tabella e il manifesto di completamento registra lo stato di elaborazione di ciascun oggetto, in modo da poter inviare nuovamente il resto. Aumentare MaxWriteRequestUnits nel StartBulkPutItems chiamare o suddividere l'input in più oggetti riduce la possibilità di un timeout.

La tabella seguente elenca i codici di errore che a FAILED l'operazione può segnalare.

Codice di errore Causa Cosa fare

Timeout

L'operazione ha superato il tempo massimo di elaborazione

Invia nuovamente il resto del manifesto di completamento

ValidationException

Un errore ha impedito a DynamoDB di leggere un oggetto di input e DynamoDB non ha potuto confermare la lettura di tutti i byte di input memorizzati

Correggi il record, quindi invialo nuovamente con i record all'esterno processedRanges

InputObjectTooLarge

Un oggetto di input supera i 5 GB

Dividi l'oggetto

S3ObjectsCountLimitExceeded

Più di 50.000 oggetti di input

Riduci il numero di oggetti o richiedi un aumento della quota

SizeLimitExceeded

Input totale superiore al limite per richiesta (100 GB per Standard, 1 TB per Accelerated)

Dividi l'input o usa Accelerated

ObjectModifiedInS3DuringImport

Un oggetto di input modificato durante l'esecuzione

Mantieni invariati gli oggetti di input durante l'esecuzione dell'operazione

KmsAccessDeniedException, KmsDisabledException, KmsNotFoundException, KmsInvalidKeyUsageException, KmsInvalidStateException

DynamoDB non poteva usare un AWS Chiave KMS per la tabella o gli oggetti Amazon S3 durante l'operazione

Verifica lo stato della chiave e le autorizzazioni chiave del chiamante

S3AccessDenied

A DynamoDB è stato negato l'accesso alla posizione di input o output in Amazon S3. Questo codice si verifica anche quando S3BucketOwner non corrisponde al proprietario del bucket.

Controlla le autorizzazioni Amazon S3 del chiamante, la policy del bucket e S3BucketOwner.

ResourceInUseException

Un'altra operazione sullo stesso tavolo è già iniziata

Attendi che l'operazione finisca, quindi ricomincia

DynamoDBResourceNotFoundException

La tabella non è stata trovata o non era accessibile

Verifica il nome e lo stato della tabella

DynamoDBAccessDeniedException

Il chiamante non è più autorizzato a scrivere sulla tabella

Ripristina dynamodb:BulkPutItems sul tavolo, quindi invia nuovamente il resto

DynamoDBItemCollectionSizeLimitExceededException

Una raccolta di articoli su una tabella con un indice secondario locale ha superato il limite di dimensione

Riduci i dati relativi a quel valore della chiave di partizione

Se DynamoDB non è in grado di inviare il manifesto di completamento nella posizione di output, l'operazione termina FAILED anche se ogni elemento è stato scritto. Il messaggio di errore inizia con «Il manifesto non è disponibile». e il codice di errore ne identifica la causa, ad esempio S3AccessDenied. Gli elementi già scritti rimangono nella tabella. Controlla Amazon S3 del chiamante e AWS Autorizzazioni KMS per il prefisso di output, quindi confronta la tabella con il tuo input per trovare ciò che è stato scritto.

Descrizione di un'operazione (AWS CLI)

aws dynamodb describe-bulk-operation \ --bulk-operation-arn arn:aws:dynamodb:us-east-1:111122223333:bulk-operation/01759414677739-041d6d92

Descrivere un'operazione (Python)

import boto3 client = boto3.client("dynamodb") response = client.describe_bulk_operation( BulkOperationArn="arn:aws:dynamodb:us-east-1:111122223333:bulk-operation/01759414677739-041d6d92" ) status = response["BulkOperationDescription"]["BulkOperationStatus"] processed_items = response["BulkOperationDescription"].get("ProcessedItemCount", 0) processed_bytes = response["BulkOperationDescription"].get("ProcessedInputBytes", 0) total_bytes = response["BulkOperationDescription"].get("TotalInputBytes") print(f"Status: {status}") print(f"Items processed: {processed_items}") if total_bytes: pct = (processed_bytes / total_bytes) * 100 print(f"Progress: {pct:.1f}%")

Elenco delle operazioni in blocco

Chiama ListBulkOperations per recuperare un elenco suddiviso in pagine di operazioni di massa nel tuo account. Ogni pagina restituisce un massimo di 25 operazioni.

Operazioni di quotazione (AWS CLI)

aws dynamodb list-bulk-operations

Le AWS CLI impagina automaticamente e stampa tutte le pagine disponibili. Per impaginare manualmente, disattiva l'impaginazione automatica e usa --max-items con --starting-token.

aws dynamodb list-bulk-operations \ --max-items 25 \ --starting-token "token-from-a-previous-NextToken"

Operazioni di quotazione (Python)

import boto3 client = boto3.client("dynamodb") paginator = client.get_paginator("list_bulk_operations") for page in paginator.paginate(): for op in page["BulkOperationsSummaryList"]: print(f"{op['BulkOperationArn']} - {op['BulkOperationStatus']}")

Annullamento di un'operazione

Chiamata CancelBulkOperation per interrompere un'operazione in corso. L'operazione passa a CANCELLING e poi a CANCELLED.

Importante

Gli articoli già scritti prima dell'annullamento sono non rotolato indietro. Rimangono nella tabella e sono immediatamente leggibili.

Mentre lo stato è CANCELLING, i contatori di avanzamento possono essere inferiori ai valori finali. Attendi CANCELLED prima di controllare i risultati. Nel manifesto, un oggetto parzialmente elaborato ha lo stato PARTIALLY_PROCESSEDe processedRanges elenca i record elaborati da DynamoDB. Record esterni processedRanges non sono stati elaborati. Inviali nuovamente, insieme a tutti i record del ERROR rapporto che hai corretto.

Annullamento di un'operazione (AWS CLI)

aws dynamodb cancel-bulk-operation \ --bulk-operation-arn arn:aws:dynamodb:us-east-1:111122223333:bulk-operation/01759414677739-041d6d92

Annullamento di un'operazione (Python)

import boto3 client = boto3.client("dynamodb") client.cancel_bulk_operation( BulkOperationArn="arn:aws:dynamodb:us-east-1:111122223333:bulk-operation/01759414677739-041d6d92" ) print("Cancellation requested. Items already written remain in the table.")

Concorrenza e quote

Per le quote che si applicano alle operazioni di vendita all'ingrosso di articoli, vedere Oggetti messi in blocco.

Non è possibile avviare un'operazione di inserimento in blocco degli elementi su una tabella che sta creando un indice. Il tentativo di eseguire questa operazione restituisce un ResourceInUseException.

Una tabella può avere una sola operazione di messa in blocco degli elementi in corso alla volta. Se è in corso un'altra operazione sulla tabella, StartBulkPutItems restituisce un ResourceInUseException. Se si avviano più operazioni contemporaneamente sulla stessa tabella, ogni chiamata può restituire un ARN. Viene quindi eseguita un'operazione e le altre falliscono con FailureCode ResourceInUseException. Chiama DescribeBulkOperation per confermare che l'operazione è in corso. Per caricare più tabelle contemporaneamente, avvia un'operazione per ogni tabella.