2012-11-21 28 views
6

मैं s3distcp का उपयोग करके केवल एक फ़ाइल को एचडीएफएस में कॉपी करना चाहता हूं। मैंने srcPattern तर्क का उपयोग करने का प्रयास किया है, लेकिन इससे मदद नहीं मिली और यह java.lang.Runtime अपवाद फेंकने पर चलता रहता है। यह संभव है कि मैं जिस रेगेक्स का उपयोग कर रहा हूं वह अपराधी है, कृपया मदद करें।अमेज़ॅन ईएमआर के साथ 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)' 

अपवाद फेंक दिया:

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 जीबी फ़ाइलें हैं, लेकिन आपके काम में केवल उनमें से एक की आवश्यकता है और आप यह फ़ाइल अपने स्थानीय एचडीएफएस में s3distcp के माध्यम से रखना चाहते हैं! – Amar

उत्तर

1

regex मैं उपयोग कर रहा था वास्तव में अपराधी था का उपयोग कर एक एकल फाइल कॉपी कर सकते हैं। कहो फ़ाइल नाम दिनांक, तो आदेश केवल इस फ़ाइल की प्रतिलिपि करने के लिए, ईएमआर आदेश के बाद करना चाहिए के लिए उदाहरण फ़ाइलों abcd-2013-06-12.gz की तरह हैं,:

लोचदार-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'

तो मुझे याद है सही ढंग से, मेरे regex शुरू में *2013-06-12.gz और नहीं .*2013-06-12.gz था। तो शुरुआत में डॉट की जरूरत थी।

2

DistCp कई मशीनों का उपयोग कर कई फ़ाइलों की प्रतिलिपि बनाने का इरादा है। यदि आप केवल एक फ़ाइल कॉपी करना चाहते हैं तो DistCp सही टूल नहीं है।

Hadoop मास्टर नोड पर, आप

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

+0

धन्यवाद। हालांकि इसका इरादा नहीं हो सकता है लेकिन आप निश्चित रूप से S3distcp का उपयोग कर इसे कॉपी कर सकते हैं। परिदृश्य पर विचार करें जब आपके पास स्वचालित पाइपलाइन चलती है जहां क्लस्टर लॉन्च किया जाता है और उन परिदृश्यों में चरण जोड़े जाते हैं s3distcp काम में आता है। अब, मेरे पास एक सिंगल 20 जीबी जीजीआईपी फाइल है जो घंटों तक चलने वाले एक मैपर की मात्रा होगी (हमारे मामले में लगभग 10 घंटे); s3distcp के '--outputCodec none' विकल्प के साथ इसका उपयोग करते हुए, यह न केवल फ़ाइलों को एचडीएफएस में प्रतिलिपि बनाता है, बल्कि फाइल को डिक्रॉप करता है जो हैडऑप को इनपुट स्प्लिट बनाने की इजाजत देता है, इस प्रकार हम एक से अधिक मैपर (समय 2 घंटे तक कम हो जाते हैं) का उपयोग करते हैं। – Amar

+0

मुझे यह जोड़ना चाहिए कि s3distcp काम नहीं करता है जब मैं s3 से एक फ़ाइल कॉपी करने का प्रयास करता हूं। मुझे * मुझे आवश्यक फ़ाइल प्राप्त करने के लिए एक उपसर्ग और फिर पैटर्न निर्दिष्ट करना होगा। दस्तावेज से बिल्कुल स्पष्ट नहीं है। – Tim