S3DistCp (s3-dist-cp) - Amazon EMR

S3DistCp (s3-dist-cp)

Apache DistCp è uno strumento open source ideale per copiare grandi quantità di dati. S3DistCp è simile a DistCp, ma è ottimizzato per funzionare con AWS, in particolare Amazon S3. Il comando per S3DistCp in Amazon EMR versione 4.0 e successive è s3-dist-cp, che puoi aggiungere come fase in un cluster o nella riga di comando. S3DistCp ti consente di copiare in modo efficiente grandi quantità di dati da Amazon S3 in HDFS, nel quale possono essere elaborati da fasi successive nel cluster Amazon EMR. Puoi inoltre utilizzare S3DistCp per copiare dati tra bucket Amazon S3 o da HDFS ad Amazon S3. S3DistCp è più efficiente e scalabile per la copia parallela di una grande quantità di oggetti tra bucket e tra account AWS.

Per i comandi specifici che dimostrano la flessibilità di S3DistCP in scenari reali, consulta l'articolo Seven tips for using S3DistCp (Sette consigli per l'utilizzo di S3DistCp) nel blog sui Big Data AWS.

Come DistCp, S3DistCp usa MapReduce per copiare in modo distribuito. Condivide la copia, la gestione degli errori, il ripristino e le attività di creazione di report su più server. Per ulteriori informazioni sul progetto open source Apache DistCp, consulta la DistCp guide (Guida su DistCp) nella documentazione di Apache Hadoop.

Se S3DistCp non è in grado di copiare alcuni o tutti i file specificati, la fase del cluster ha esito negativo e restituisce un codice di errore diverso da zero. In questo caso, S3DistCp non elimina i file parzialmente copiati.

Importante

S3DistCp non supporta nomi di bucket Amazon S3 contenenti il trattino basso.

S3distCP non supporta la concatenazione per i file Parquet. Usa invece PySpark. Per ulteriori informazioni, consulta la sezione relativa alla Concatenazione dei file Parquet in Amazon EMR.

Per evitare errori di copia quando si utilizza S3DistCP per copiare un singolo file (anziché una directory) da S3 a HDFS, utilizza Amazon EMR versione 5.33.0 o successive o Amazon EMR versione 6.3.0 o successive.

Opzioni S3DistCp

Per quanto simile a DistCp, S3DistCp supporta una serie di opzioni differenti per modificare le modalità di copia e compressione dei dati.

Quando richiami S3DistCp, puoi specificare le opzioni descritte nella tabella seguente. Le opzioni vengono aggiunte alla fase con l'elenco di argomenti. Esempi di argomenti S3DistCp sono illustrati nella seguente tabella.

Opzione Descrizione Obbligatorio
‑‑src=LOCATION

Posizione dei dati da copiare. Può essere una posizione HDFS o Amazon S3.

Esempio: ‑‑src=s3://DOC-EXAMPLE-BUCKET1/logs/j-3GYXXXXXX9IOJ/node

Importante

S3DistCp non supporta nomi di bucket Amazon S3 contenenti il trattino basso.

‑‑dest=LOCATION

Destinazione per i dati. Può essere una posizione HDFS o Amazon S3.

Esempio: ‑‑dest=hdfs:///output

Importante

S3DistCp non supporta nomi di bucket Amazon S3 contenenti il trattino basso.

‑‑srcPattern=PATTERN

Un'espressione regolare che filtra l'operazione di copia per un sottoinsieme dei dati in ‑‑src. Se non è specificato né ‑‑srcPattern‑‑groupBy, tutti i dati in ‑‑src vengono copiati su ‑‑dest.

Se l'argomento dell'espressione regolare contiene caratteri speciali quali l'asterisco (*), l'espressione regolare o l'intera stringa ‑‑args deve essere racchiusa tra virgolette singole (').

Esempio: ‑‑srcPattern=.*daemons.*-hadoop-.*

No
‑‑groupBy=PATTERN

Un'espressione regolare che determina il concatenamento da parte di S3DistCp dei file che soddisfano l'espressione stessa. Ad esempio, è possibile utilizzare questa opzione per riunire in un unico file tutti i file di log scritti in un'ora. Il filename concatenato è il valore trovato dall'espressione regolare per il raggruppamento.

Le parentesi indicano il modo in cui i file devono essere raggruppati, con tutti gli elementi che soddisfano l'istruzione tra parentesi riuniti in un singolo file di output. Se l'espressione regolare non include un'istruzione fra parentesi, la fase S3DistCp nel cluster ha esito negativo e viene restituito un errore.

Se l'argomento dell'espressione regolare contiene caratteri speciali quali l'asterisco (*), l'espressione regolare o l'intera stringa ‑‑args deve essere racchiusa tra virgolette singole (').

Se è specificato ‑‑groupBy, vengono copiati solo i file che corrispondono al modello specificato. Non è necessario specificare ‑‑groupBy e ‑‑srcPattern contemporaneamente.

Esempio: ‑‑groupBy=.*subnetid.*([0-9]+-[0-9]+-[0-9]+-[0-9]+).*

No
‑‑targetSize=SIZE

La dimensione in mebibyte (MiB) dei file da creare in base all'opzione ‑‑groupBy. Questo valore deve essere un numero intero. Se ‑‑targetSize è impostato, S3DistCp cerca di rispettare queste dimensioni; di fatto i file copiati possono essere più grandi o più piccoli di questo valore. I processi vengono aggregati in base alle dimensioni del file di dati, pertanto è possibile che la dimensione del file di destinazione corrisponda a quella del file di origine.

Se i file concatenati da ‑‑groupBy hanno una dimensione maggiore rispetto al valore di ‑‑targetSize, vengono suddivisi in file part e denominati in sequenza con un valore numerico aggiunto alla fine. Ad esempio, un file concatenato in myfile.gz sarebbe suddiviso in parti come: myfile0.gz, myfile1.gz ecc.

Esempio: ‑‑targetSize=2

No
‑‑appendToLastFile

Specifica il comportamento di S3DistCp durante la copia da Amazon S3 su HDFS di file già presenti. Aggiunge i nuovi dati ai file esistenti. Se utilizzi ‑‑appendToLastFile con ‑‑groupBy, i nuovi dati vengono aggiunti ai file che corrispondono agli stessi gruppi. Questa opzione rispetta anche il comportamento ‑‑targetSize quando usato con ‑‑groupBy.

No
‑‑outputCodec=CODEC

Specifica i codec di compressione da utilizzare per i file copiati. I valori possibili sono gzip, gz, lzo, snappy o none. È possibile utilizzare questa opzione, ad esempio, per convertire i file di input compressi con Gzip in file di output con compressione LZO o per decomprimere i file durante l'operazione di copia. Se scegli un codec di output, il filename viene aggiunto con l'estensione appropriata (ad esempio per gz e gzip, l'estensione è .gz). Se non specifichi un valore per ‑‑outputCodec, i file vengono copiati senza apportare modifiche alla compressione.

Esempio: ‑‑outputCodec=lzo

No
‑‑s3ServerSideEncryption

Garantisce che i dati di destinazione siano trasferiti tramite il protocollo SSL e automaticamente crittografati in Amazon S3 con una chiave lato servizio AWS. Durante il recupero dei dati con S3DistCp, gli oggetti vengono automaticamente decrittografati. Se tenti di copiare un oggetto non crittografato in un bucket Amazon S3 che richiede la crittografia, l'operazione ha esito negativo. Per maggiori informazioni, consulta Utilizzo della crittografia dei dati.

Esempio: ‑‑s3ServerSideEncryption

No
‑‑deleteOnSuccess

Se l'operazione di copia viene completata, questa opzione indica a S3DistCp di eliminare i file copiati dal percorso di origine. Questa funzione è utile se stai copiando file di output, ad esempio i file di log, da una posizione a un'altra come attività pianificata e non vuoi copiare lo stesso file due volte.

Esempio: ‑‑deleteOnSuccess

No
‑‑disableMultipartUpload

Disattiva l'utilizzo del caricamento in più parti.

Esempio: ‑‑disableMultipartUpload

No
‑‑multipartUploadChunkSize=SIZE

Le dimensioni, in MiB, di ogni parte in un caricamento in più parti di Amazon S3. S3DistCP utilizza il caricamento in più parti quando copia dati di dimensioni superiori rispetto a multipartUploadChunkSize. Per migliorare le prestazioni del processo, puoi aumentare le dimensioni di ogni parte. La dimensione predefinita è 128 MiB.

Esempio: ‑‑multipartUploadChunkSize=1000

No
‑‑numberFiles

Antepone numeri sequenziali ai file di output. Il conteggio inizia da 0, a meno che non venga specificato un valore diverso tramite ‑‑startingIndex.

Esempio: ‑‑numberFiles

No
‑‑startingIndex=INDEX

Utilizzato con ‑‑numberFiles per specificare il primo numero nella sequenza.

Esempio: ‑‑startingIndex=1

No
‑‑outputManifest=FILENAME

Crea un file di testo, compresso con Gzip, che contiene un elenco di tutti i file copiati da S3DistCp.

Esempio: ‑‑outputManifest=manifest-1.gz

No
‑‑previousManifest=PATH

Legge un file manifest creato durante una precedente chiamata a S3DistCp utilizzando il flag ‑‑outputManifest. Quando viene impostato il flag ‑‑previousManifest, S3DistCp esclude i file elencati nel manifest dall'operazione di copia. Se viene specificato ‑‑outputManifest insieme a ‑‑previousManifest, i file elencati nel manifest precedente compaiono anche nel nuovo file manifest, pur non venendo copiati.

Esempio: ‑‑previousManifest=/usr/bin/manifest-1.gz

No
‑‑requirePreviousManifest

Richiede un manifest precedente creato durante una precedente chiamata a S3DistCp. Se impostato su false, non vengono generati errori se non viene specificato un manifest precedente. Il valore predefinito è true.

No
‑‑copyFromManifest

Inverte il comportamento di ‑‑previousManifest per indicare a S3DistCp di utilizzare il file manifest specificato come un elenco di file da copiare, invece che da escludere dalla copia.

Esempio: ‑‑copyFromManifest ‑‑previousManifest=/usr/bin/manifest-1.gz

No
‑‑s3Endpoint=ENDPOINT

Specifica l'endpoint Amazon S3 da utilizzare durante il caricamento di un file. Questa opzione imposta l'endpoint sia per l'origine che per la destinazione. Se non è impostato, l'endpoint predefinito è s3.amazonaws.com. Per un elenco degli endpoint di Amazon S3, consulta la sezione relativa a Regioni ed endpoint.

Esempio: ‑‑s3Endpoint=s3.eu-west-1.amazonaws.com

No
‑‑storageClass=CLASS

La classe di archiviazione da utilizzare quando la destinazione è Amazon S3. I valori validi sono STANDARD e REDUCED_REDUNDANCY. Se questa opzione non è specificata, S3DistCp cerca di preservare la classe di storage.

Esempio: ‑‑storageClass=STANDARD

No
‑‑srcPrefixesFile=PATH

Un file di testo in Amazon S3 (s3://), HDFS (hdfs:///) o nel file system locale (file:/) che contiene un elenco di prefissi src, uno per riga.

Se srcPrefixesFile viene indicato, S3DistCp non elenca il percorso src. Al contrario, genera un elenco di origine combinando tutti gli elenchi di prefissi specificati in questo file. Per generare percorsi di destinazione, invece dei prefissi verrà utilizzato il percorso relativo rispetto al percorso di src. Se viene specificato anche srcPattern, verrà applicato ai risultati dell'elenco combinato dei prefissi di origine per filtrare ulteriormente l'input. Se viene utilizzato copyFromManifest, gli oggetti nel manifest verranno copiati e srcPrefixesFile verrà ignorato.

Esempio: ‑‑srcPrefixesFile=PATH

No

Oltre alle opzioni sopra riportate, in S3DistCp è implementata l'interfaccia Tool, il che significa che sono supportate le opzioni generiche.

Aggiunta di S3DistCp come fase in un cluster

È possibile effettuare la chiamata a S3DistCp aggiungendolo come fase nel cluster. È possibile aggiungere fasi a un cluster all'avvio o in esecuzione utilizzando la console, la CLI o l'API. I seguenti esempi illustrano l'aggiunta di una fase S3DistCp su un cluster in esecuzione. Per ulteriori informazioni sull'aggiunta di fasi a un cluster, consulta Invio di lavoro a un cluster nella Guida alla gestione di Amazon EMR.

Per aggiungere una fase S3DistCp a un cluster in esecuzione utilizzando la AWS CLI

Per ulteriori informazioni sull'utilizzo di comandi Amazon EMR nella AWS CLI, consulta la Guida di riferimento ai comandi della AWS CLI.

  • Per aggiungere una fase a un cluster che chiama S3DistCp, trasferire come argomenti i parametri che specificano in che modo S3DistCp deve eseguire l'operazione di copia.

    L'esempio seguente copia il log dei daemon da Amazon S3 a hdfs:///output. Nel comando riportato qui di seguito:

    Per aggiungere una fase di copia S3DistCp a un cluster in esecuzione, inserisci quanto segue in un file JSON salvato in Amazon S3 o nel file system locale come myStep.json per questo esempio. Sostituisci j-3GYXXXXXX9IOK con l'ID del cluster e sostituisci mybucket con il nome del bucket Amazon S3.

    [ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*[a-zA-Z,]+"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]
    aws emr add-steps ‑‑cluster-id j-3GYXXXXXX9IOK ‑‑steps file://./myStep.json
Esempio Copia dei file di log da Amazon S3 ad HDFS

Questo esempio illustra anche come copiare in HDFS i file di log archiviati in un bucket Amazon S3 aggiungendo una fase a un cluster in esecuzione. In questo esempio l'opzione ‑‑srcPattern viene utilizzata per limitare i dati copiati nel log dei daemon.

Per copiare i file di log da Amazon S3 a HDFS utilizzando l'opzione ‑‑srcPattern, inserisci quanto segue in un file JSON salvato in Amazon S3 o nel file system locale come myStep.json per questo esempio. Sostituisci j-3GYXXXXXX9IOK con l'ID del cluster e sostituisci mybucket con il nome del bucket Amazon S3.

[ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*daemons.*-hadoop-.*"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]