2011-10-18 17 views
42

-put और -copyFromLocal के बीच अंतर समान रूप से दस्तावेज किया गया है, जबकि अधिकांश उदाहरण वर्बोज़ संस्करण -कोपीफ्रोमोकल का उपयोग करते हैं। क्यूं कर? , आदेश डाल करने के लिए, सिवाय इसके कि स्रोत एक स्थानीय फ़ाइल संदर्भ के लिए प्रतिबंधित हैहडूप एफएस -पुट और हडूप एफएस -कोपीफ्रोमोकल

-get के लिए यही बात और -copyToLocal

+0

कृपया इस लिंक को चेक करें जिसमें स्रोत कोड स्तर में विवरण का उल्लेख किया गया है http://hakunamapdata.com/why-put-is-better-than-copyfromlocal-when-coping-files-to-hdfs/ –

उत्तर

53
  • copyFromLocal समान है।

तो, मूल रूप से आप कर सकते हैं साथ, तुम सब है कि copyFromLocal डाल साथ, लेकिन नहीं करतीं।

इसी तरह,

  • copyToLocal समान करने के लिए , आदेश प्राप्त सिवाय इसके कि गंतव्य स्थानीय फाइल संदर्भ के लिए प्रतिबंधित किया गया है।

इसलिए, आप दौर दूसरा रास्ता नहीं बजाय मिल copyToLocal उपयोग कर सकते हैं, लेकिन।

संदर्भ: Hadoop's documentation

अद्यतन: अक्टूबर 2015 तक नवीनतम के लिए, कृपया नीचे this उत्तर देखें।

35

एक उदाहरण करते हैं: अपने HDFS पथ है, तो: /tmp/dir/abc.txt और अगर अपने स्थानीय डिस्क भी इस पथ है तो HDFS एपीआई पता नहीं होगा जो एक तुम मतलब है, जब तक आप file:// या hdfs:// की तरह एक योजना निर्दिष्ट । शायद यह उस पथ को चुनता है जिसे आप कॉपी नहीं करना चाहते थे।

इसलिए आपके पास -copyFromLocal है जो आपको स्थानीय फाइल सिस्टम को दिए गए पैरामीटर को सीमित करके गलती से गलत फ़ाइल की प्रतिलिपि बनाने से रोक रहा है।

Put अधिक उन्नत उपयोगकर्ताओं के लिए है जो जानते हैं कि कौन सी योजना सामने रखी जाए।

यह हमेशा नए हैडोप उपयोगकर्ताओं के लिए थोड़ा उलझन में है जो वर्तमान में फाइल सिस्टम में हैं और जहां उनकी फ़ाइलें वास्तव में हैं।

+1

आपका क्या मतलब है "एचडीएफएस एपीआई नहीं जान पाएगा कि आपका मतलब क्या है"? '-पुट' के लिए स्रोत हमेशा पहला तर्क होता है। या आप का मतलब है कि कुछ उपयोगकर्ता '-get' को '-get' से भ्रमित कर सकते हैं? – snappy

+0

नहीं, न तो रास्ता। हम यहां दो अलग-अलग फाइल सिस्टम के बारे में बात कर रहे हैं। एचडीएफएस और स्थानीय फाइल सिस्टम (ext4 कहें)। 'Bin/hadoop fs -put/tmp/somepath/user/hadoop/somepath' का उपयोग करके कमांड वास्तव में नहीं जानता है कि'/tmp/somepath' दोनों फाइल सिस्टम में या केवल स्थानीय फाइल सिस्टम में मौजूद है या नहीं। गंतव्य पथ के साथ वही बात। –

+7

तो पहला पैरामीटर हमेशा एक स्थानीय एफएस पथ नहीं कहता है। यदि आप चाहें तो आप एक एचडीएफएस से दूसरे में 'डाल' सकते हैं। '-copyFromLocal' यह सुनिश्चित करेगा कि यह सिर्फ स्थानीय डिस्क से चिपकता है और एचडीएफएस पर अपलोड करता है। –

2
  • दोनों
  • copyFromLocal को छोड़कर एक ही स्थानीय से कॉपी करने के लिए, जबकि put किसी से फ़ाइल ले जा सकते हैं प्रतिबंधित है कर रहे हैं (अन्य HDFS/स्थानीय फाइल सिस्टम/..)
10
क्या प्रलेखन ने दावा किया है के बावजूद

, अब तक (अक्टूबर 2015), -copyFromLocal और -put दोनों समान हैं।

ऑनलाइन मदद से

:

public static class CopyFromLocal extends Put { 
    public static final String NAME = "copyFromLocal"; 
    public static final String USAGE = Put.USAGE; 
    public static final String DESCRIPTION = "Identical to the -put command."; 
    } 

    public static class CopyToLocal extends Get { 
    public static final String NAME = "copyToLocal"; 
    public static final String USAGE = Get.USAGE; 
    public static final String DESCRIPTION = "Identical to the -get command."; 
    } 

:

[[email protected] ~]$ hdfs dfs -help copyFromLocal 
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> : 
    Identical to the -put command. 

और यह looking at the sources है, जहां आप देख सकते हैं कि CopyFromLocal वर्ग रखें वर्ग फैली द्वारा की पुष्टि की है, लेकिन किसी भी नए व्यवहार जोड़े बिना जैसा कि आप इसे देख सकते हैं, यह get/copyToLocal के लिए बिल्कुल वही है।

0

दोनों 'डाल' & 'copyFromLocal' आदेश बिल्कुल वही काम करते हैं। आप फ़ाइलों को एक hdfs निर्देशिका से दूसरे में कॉपी करने के लिए 'put' कमांड का उपयोग नहीं कर सकते हैं। आइए इसे एक उदाहरण के साथ देखें: कहें कि आपकी रूट में दो निर्देशिकाएं हैं, जिन्हें 'test1' और 'test2' नाम दिया गया है। यदि 'test1' में फ़ाइल 'customer.txt' है और आप इसे test2 निर्देशिका
$ hadoop fs -put /test1/customer.txt/test2 पर कॉपी करने का प्रयास करें, तो इसके परिणामस्वरूप 'ऐसी कोई फ़ाइल या निर्देशिका' त्रुटि नहीं होगी ' डाल 'स्थानीय फाइल सिस्टम में फ़ाइल की तलाश करेगा और hdfs नहीं। वे दोनों स्थानीय फाइल सिस्टम से केवल hdfs तक फ़ाइलों (या निर्देशिका) की प्रतिलिपि बनाने के लिए हैं।

+0

शायद अगर आप पहले तर्क में फाइल सिस्टम निर्दिष्ट करते हैं, तो यह स्थानीय नहीं पढ़ेगा? 'hadoop fs -put hdfs: ///test1/customer.txt hdfs: /// test2'? –

संबंधित मुद्दे