2015-03-30 19 views
5

Ho uno script Pig (utilizzando un MultiStorage leggermente modificato) che trasforma alcuni dati. Una volta che lo script viene eseguito, ho i dati nel seguente formato su HDFS:Rimuovere il livello di directory durante il trasferimento da HDFS a S3 utilizzando S3DistCp

/tmp/data/identifier1/indentifier1-0,0001 
/tmp/data/identifier1/indentifier1-0,0002 
/tmp/data/identifier2/indentifier2-0,0001 
/tmp/data/identifier3/indentifier3-0,0001 

che sto tentando di utilizzare S3DistCp per copiare questi file S3. Sto usando l'opzione --groupBy .*(identifier[0-9]).* per combinare i file in base all'identificatore. La combinazione funziona, ma quando si copia su S3, anche le cartelle vengono copiate. L'output finale è:

/s3bucket/identifier1/identifier1 
/s3bucket/identifier2/identifier2 
/s3bucket/identifier3/identifier3 

C'è un modo per copiare questi file senza quella prima cartella? Idealmente, la mia uscita in S3 sarà simile:

/s3bucket/identifier1 
/s3bucket/identifier2 
/s3bucket/identifier3 

Un'altra soluzione che ho considerato è quello di utilizzare i comandi HDFS per estrarre i file dalla loro directory prima di copiare a S3. È una soluzione ragionevole?

Grazie!

+0

puoi pubblicare il tuo comando. –

+0

Supponendo che si intenda per comando s3distcp, ecco gli argomenti passati al passo EMR: '--s3Endpoint s3.amazonaws.com --src hdfs: /// tmp/data/--dest s3: // output --groupBy . */(identificatore). * ' – NolanDC

+1

A questo punto nel tempo s3distcp non può appiattire le directory. Accedi a https://forums.aws.amazon.com/thread.jspa?messageID=479023񴼯 per la richiesta di funzionalità. – ChristopherB

risposta

3

La soluzione sono arrivato al momento è quello di utilizzare distcp per portare questi file fuori delle directory prima di utilizzare s3distcp:

hadoop distcp -update /tmp/data/** /tmp/grouped 

Poi, ho cambiato il copione s3distcp per spostare i dati da /tmp/grouped nel mio secchio S3 .

+1

Ho provato questa soluzione ma la copia ha errato con il reclamo che "causerebbe i duplicati". Questo perché ho avuto file con lo stesso nome in diverse sottodirectory. C'è un modo semplice per aggirare questo? – fblundun

0

L'utilizzo di distcp prima dello s3distcp è molto costoso. Un'altra opzione che hai è quella di creare un file manifest con tutti i tuoi file e dare il suo percorso a s3distcp. In questo manifest puoi definire il "nome base" di ogni file. Se hai bisogno di un esempio di file manifest, esegui s3distcp in qualsiasi cartella con argomento --outputManifest. ulteriori informazioni possono essere trovate here