2012-11-21 60 views
6

我想使用s3distcp僅將單個文件複製到HDFS。我已經嘗試使用srcPattern參數,但它沒有幫助,它一直拋出java.lang.Runtime異常。 有可能我使用的正則表達式是罪魁禍首,請幫忙。將s3distcp與Amazon EMR配合使用來複制單個文件

我的代碼如下:

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

誰低估了它,我可以知道它的原因嗎? – Amar

+0

如果在s3的給定位置有很多15 GB的文件,但是您的工作只需要其中的一個,並且您希望通過s3distcp在您的本地hdfs中擁有此文件,該怎麼辦! – Amar

回答

1

我用的確是罪魁禍首正則表達式的單個文件。 說的文件名有日期的文件,例如像abcd-2013-06-12.gz,那麼爲了只複製這個文件,下面的EMR命令,應該做的:

彈性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'

如果我沒有記錯,我正則表達式最初是*2013-06-12.gz而不是.*2013-06-12.gz。所以在開始時需要點。

2

DistCp使用的目的複製使用多臺機器上的許多文件。如果您只想複製一個文件,則DistCp不是正確的工具。

在Hadoop的主節點,您可以複製使用

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

+0

謝謝。雖然它可能不是有意的,但你當然可以使用S3distcp來複制它。考慮這種情況,當你有一個自動化的管道運行時,在啓動集羣並在這些情況下添加步驟的情況下,s3distcp派上用場。現在,假設我有一個單獨的20GB gzip文件,這個文件可以在一個映射器上運行幾個小時(在我們的例子中大約需要10個小時)。使用s3distcp的'--outputCodec none'選項,它不僅可以將文件複製到HDFS,而且可以解壓縮文件,從而允許hadoop創建輸入分割,從而使我們可以使用多個映射器(時間縮短到2小時)。 – Amar

+0

我應該補充一點,當我嘗試從s3複製單個文件時,s3distcp不起作用。我*必須*指定一個前綴,然後模式來獲取我需要的文件。從文檔中根本不明顯。 – Tim

相關問題