2012-11-21 31 views
6

Chcę skopiować tylko jeden plik do HDFS przy użyciu s3distcp. Próbowałem użyć argumentu srcPattern, ale to nie pomogło i nadal rzuca wyjątek java.lang.Runtime. Jest możliwe, że regex, którego używam, jest winowajcą, proszę o pomoc.Używanie s3distcp z Amazon EMR do skopiowania pojedynczego pliku

Mój kod wygląda następująco:

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

Wyjątek rzucony:

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

Ktokolwiek go zarzucił, czy mogę znać powód? – Amar

+0

Co jeśli masz wiele plików 15 GB w danej lokalizacji w s3, ale twoja praca potrzebuje tylko jednego z nich i chcesz mieć ten plik w lokalnym hdfie przez s3distcp! – Amar

Odpowiedz

1

regex używałem był rzeczywiście sprawcą. Say nazwy plików mają termin, na przykład pliki są jak abcd-2013-06-12.gz, a następnie w celu skopiowania tylko ten plik, po polecenia EMR powinien zrobić:

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

Jeśli dobrze pamiętam, mój regex początkowo był *2013-06-12.gz i nie .*2013-06-12.gz. Więc kropka na początku była potrzebna.

2

DistCp jest przeznaczony do kopiowania wielu plików za pomocą wielu urządzeń. DistCp nie jest właściwym narzędziem, jeśli chcesz skopiować tylko jeden plik.

Na węźle głównym Hadoop, można skopiować pojedynczy plik, używając

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

+0

Dzięki. Chociaż może to nie być zamierzone, ale na pewno można go skopiować za pomocą S3distcp. Rozważ scenariusz, gdy masz uruchomiony automatyczny przebieg potoków, gdzie w klastrze jest uruchamiany i kroki są dodawane w tych scenariuszach s3distcp przydaje się. Teraz powiedzmy, że mam POJEDYNCZY 20 GB plik gzip, który byłby jednym programem odwzorowującym działającym przez wiele godzin (w naszym przypadku około 10 godzin); używając go z opcją s3distcp "--outputCodec none", nie tylko kopiuje pliki do HDFS, ale dekompresuje plik pozwalając hadoopowi na tworzenie podziałów wejściowych, co pozwala nam używać więcej niż jednego mappersa (czas zredukowany do 2 godzin). – Amar

+0

Należy dodać, że s3distcp nie działa, gdy próbuję skopiować pojedynczy plik z s3. * Muszę podać * prefiks, a następnie wzorzec, aby uzyskać potrzebny plik. W ogóle nie wynika to z dokumentacji. – Tim