2012-11-21 7 views
6

Ich möchte mit s3distcp nur eine einzige Datei in HDFS kopieren. Ich habe versucht, mit dem srcPattern-Argument, aber es hat nicht geholfen und es wirft weiter java.lang.Runtime Ausnahme. Es ist möglich, dass der Regex, den ich benutze, der Übeltäter ist, bitte helfen Sie.Verwenden von s3distcp mit Amazon EMR zum Kopieren einer einzelnen Datei

Mein Code ist wie folgt:

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)' 

Exception geworfen:

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

Wer hat es abgelehnt, kann ich den Grund dafür wissen? – Amar

+0

Was ist, wenn Sie viele 15-GB-Dateien an einem bestimmten Ort in S3 haben, aber Ihr Job braucht nur einen von ihnen und Sie möchten diese Datei in Ihren lokalen hdfs über s3distcp haben! – Amar

Antwort

1

Die Regex war ich mit war. Sagen Sie die Dateinamen Daten haben , zum Beispiel Dateien wie abcd-2013-06-12.gz sind, um dann NUR diese Datei zu kopieren, emr Befehl sollte Folgendes tun:

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

Wenn ich mich richtig erinnere, meine regex war zunächst *2013-06-12.gz und nicht .*2013-06-12.gz. Also der Punkt am Anfang wurde benötigt.

2

DistCp soll viele Dateien mit vielen Maschinen kopieren. DistCp ist nicht das richtige Werkzeug, wenn Sie nur eine Datei kopieren möchten.

Auf dem hadoop Master-Knoten, können Sie eine einzelne Datei in der Tat der Täter mit kopieren

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

+0

Danke. Es ist zwar nicht beabsichtigt, aber Sie können es mit S3distcp kopieren. Stellen Sie sich das Szenario vor, wenn Sie einen automatisierten Pipeline-Lauf haben, bei dem im Cluster gestartet wird und Schritte in diesen Szenarien hinzugefügt werden. S3distcp ist praktisch. Nun, sagen wir, ich habe eine SINGLE 20GB gzip-Datei, die zu einem einzelnen Mapper führen würde, der stundenlang läuft (in unserem Fall etwa 10 Stunden); Mit der Option '--outputCodec none' von s3distcp werden nicht nur die Dateien in HDFS kopiert, sondern die Datei dekomprimiert, was es hadoop ermöglicht, Input-Splits zu erstellen. Dadurch können wir mehr als einen Mapper verwenden (Zeit auf 2 Stunden reduziert). – Amar

+0

Ich sollte hinzufügen, dass s3distcp nicht funktioniert, wenn ich versuche, eine einzelne Datei von s3 zu kopieren. Ich * muss ein Präfix angeben und dann ein Muster erstellen, um die Datei zu erhalten, die ich brauche. Aus der Dokumentation überhaupt nicht ersichtlich. – Tim

Verwandte Themen