2012-11-21 29 views
6

Tôi muốn sao chép chỉ một tệp vào HDFS bằng s3distcp. Tôi đã thử bằng cách sử dụng đối số srcPattern nhưng nó không giúp đỡ và nó tiếp tục ném ngoại lệ java.lang.Runtime. Có thể là regex tôi đang sử dụng là thủ phạm, xin vui lòng giúp đỡ.Sử dụng s3distcp với Amazon EMR để sao chép một tệp đơn

Mã của tôi là như sau:

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

ngoại lệ ném:

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

Ai hạ được phiếu bầu, tôi có thể biết lý do không? – Amar

+0

Nếu bạn có nhiều tệp 15 GB tại một vị trí nhất định trong s3, nhưng công việc của bạn chỉ cần một trong số chúng và bạn muốn có tệp này trong hdfs cục bộ của bạn thông qua s3distcp! – Amar

Trả lời

1

Các regex Tôi đã sử dụng là thực sự là thủ phạm. Nói tên tập tin có ngày tháng, cho các tập tin ví dụ là như abcd-2013-06-12.gz, sau đó để sao chép CHỈ tập tin này, sau lệnh EMR nên làm:

đàn hồi-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'

Nếu tôi nhớ không lầm thì regex của tôi ban đầu là *2013-06-12.gz và không .*2013-06-12.gz. Vì vậy, dấu chấm ở đầu là cần thiết.

2

DistCp được thiết kế để sao chép nhiều tập tin sử dụng nhiều máy. DistCp không phải là công cụ phù hợp nếu bạn chỉ muốn sao chép một tệp.

Trên nút hadoop tổng thể, bạn có thể sao chép một tập tin duy nhất sử dụng

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

+0

Cảm ơn. Mặc dù nó có thể không được dự định nhưng bạn chắc chắn có thể sao chép nó bằng S3distcp. Hãy xem xét kịch bản khi bạn có một đường ống dẫn tự động chạy nơi cụm được khởi chạy và các bước được thêm vào trong các kịch bản đó s3distcp có ích. Bây giờ, nói rằng tôi có một tệp gzip 20 GB SINGLE mà sẽ tính đến một người lập bản đồ duy nhất chạy trong nhiều giờ (khoảng 10 giờ trong trường hợp của chúng tôi); sử dụng nó với tùy chọn '--outputCodec none' của s3distcp, nó không chỉ sao chép các tệp sang HDFS mà còn giải nén tệp cho phép hadoop tạo các phần tách đầu vào, do đó cho phép chúng tôi sử dụng nhiều hơn một người lập bản đồ (thời gian giảm xuống còn 2 giờ). – Amar

+0

Tôi nên thêm rằng s3distcp không hoạt động khi tôi cố sao chép một tệp từ s3. Tôi * phải * chỉ định một tiền tố và sau đó là mẫu để lấy tệp tôi cần. Không rõ ràng từ các tài liệu ở tất cả. – Tim

Các vấn đề liên quan