2012-11-21 13 views
6

Voglio copiare solo un singolo file su HDFS utilizzando s3distcp. Ho provato a utilizzare l'argomento srcPattern ma non ha aiutato e continua a lanciare l'eccezione java.lang.Runtime. È possibile che la regex che sto usando sia colpevole, per favore aiutatemi.Uso di s3distcp con Amazon EMR per copiare un singolo file

Il mio codice è il seguente:

elastic-mapreduce -j $jobflow --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src,s3://<mybucket>/<path>' --args '--dest,hdfs:///output' --arg --srcPattern --arg '(filename)' 

Eccezione gettata:

Exception in thread "main" java.lang.RuntimeException: Error running job at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:586) at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:216) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) at com.amazon.external.elasticmapreduce.s3distcp.Main.main(Main.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.util.RunJar.main(RunJar.java:156) Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs:/tmp/a088f00d-a67e-4239-bb0d-32b3a6ef0105/files at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:197) at org.apache.hadoop.mapred.SequenceFileInputFormat.listStatus(SequenceFileInputFormat.java:40) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:208) at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:1036) at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1028) at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:172) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:944) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:897) at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:871) at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1308) at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:568) ... 9 more 
+0

Chiunque lo ha downvoted, posso conoscerne il motivo? – Amar

+0

Cosa succede se ci sono molti file da 15 GB in una determinata posizione in s3, ma il lavoro ne richiede solo uno e si desidera avere questo file nel proprio hdf locale tramite s3distcp! – Amar

risposta

1

L'espressione regolare che stavo usando era davvero il colpevole. Dite i nomi dei file hanno date, ad esempio i file sono come abcd-2013-06-12.gz, quindi al fine di copiare solo questo file, seguente comando EMR dovrebbe fare:

elastico-MapReduce -j $ jobflow --jar S3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src, s3: ///' --args '--dest, hdfs: /// output' --arg --srcPattern --arg '* 2013-06-12.gz'

Se non ricordo male, il mio regex inizialmente era *2013-06-12.gz e non .*2013-06-12.gz. Quindi era necessario il punto all'inizio.

2

DistCp ha lo scopo di copiare molti file utilizzando molte macchine. DistCp non è lo strumento giusto se vuoi copiare solo un file.

Sul nodo master Hadoop, è possibile copiare un singolo file utilizzando

hadoop fs -cp s3://<mybucket>/<path> hdfs:///output

+0

Grazie. Anche se potrebbe non essere inteso, puoi sicuramente copiarlo usando S3distcp. Considerare lo scenario in cui è in esecuzione una pipeline automatizzata in cui viene avviato il cluster e vengono aggiunti i passaggi in tali scenari. S3distcp è utile. Ora, diciamo che ho un file gzip SINGLE da 20 GB che equivarrebbe a un singolo mapper in esecuzione per ore (circa 10 ore nel nostro caso); utilizzandolo con l'opzione'outputCodec none 'di s3distcp, non solo copia i file su HDFS ma decomprime il file consentendo a hadoop di creare divisioni di input, consentendoci di utilizzare più di un mapper (tempo ridotto a 2 ore). – Amar

+0

Devo aggiungere che s3distcp non funziona quando provo a copiare un singolo file da s3. I * devo * specificare un prefisso e quindi creare pattern per ottenere il file di cui ho bisogno. Non è affatto ovvio dalla documentazione. – Tim

Problemi correlati