2012-11-21 2 views
6

s3distcp를 사용하여 하나의 파일을 HDFS로 복사하려고합니다. srcPattern 인수를 사용해 보았지만 도움이되지 않았으며 java.lang.Runtime 예외를 throw합니다. 내가 사용하는 정규 표현식이 범인 일 수 있습니다. 도와주세요. 다음과 같이Amazon EMR에서 s3distcp를 사용하여 단일 파일 복사

내 코드는 다음과 같습니다

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

예외가 throw :

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

누가 그것을 downvoted 누구, 그 이유를 알 수 있습니까? – Amar

+0

s3의 주어진 위치에 많은 15GB 파일이 있지만 작업 중 하나만 필요하고 s3distcp를 통해 로컬 hdfs에이 파일을 갖고 싶다면 어떻게해야합니까? – Amar

답변

1

내가 실제로 범인이었다 사용 된 정규식을 사용하여 하나의 파일을 복사 할 수 있습니다.

탄성 맵리 듀스 -j $ jobflow --jar S3 :/예제 파일은 abcd-2013-06-12.gz처럼에 대한 파일 이름이해야 할 EMR 명령을 다음, 다음 만이 파일을 복사하기 위해, 날짜가 말 /us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src, s3 : ///'--args '--dest, hdfs : /// output' --arg --srcPattern --arg '. * 2013-06-12.gz'

내가 기억하는 경우

가 제대로, 내 정규식이 처음 *2013-06-12.gz하지 .*2013-06-12.gz했다. 그래서 처음에는 점이 필요했습니다.

2

DistCp이 많은 기계를 사용하여 여러 파일을 복사하기위한 것입니다. DistCp는 하나의 파일 만 복사하려는 경우 올바른 도구가 아닙니다. 하둡 마스터 노드에서

, 당신은

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

+0

감사. 비록 그것이 의도되지는 않았지만 확실히 S3distcp를 사용하여 복사 할 수 있습니다. s3distcp가 편리한 시나리오에서 클러스터가 시작되고 단계가 추가되는 자동화 된 파이프 라인 실행이있는 시나리오를 고려하십시오. 자, 하나의 매퍼가 몇 시간 (이 경우에는 약 10 시간) 실행되는 한 개의 20GB gzip 파일이 있다고 가정 해보십시오. s3distcp의 '--outputCodec none'옵션과 함께 사용하면 파일을 HDFS로 복사 할뿐만 아니라 hadoop이 입력 분할을 만들 수 있도록 파일의 압축을 풀어 두 개 이상의 매퍼를 사용할 수 있습니다 (2 시간으로 단축). – Amar

+0

s3에서 하나의 파일을 복사하려고 할 때 s3distcp가 작동하지 않는다고 추가해야합니다. * * 접두어를 지정한 다음 필요한 파일을 얻기 위해 패턴을 지정해야합니다. 문서에서 전혀 분명한 것은 아닙니다. – Tim