2013-10-24 10 views
9

मैं hdfs -put का उपयोग कर रहा हूं ताकि बड़ी 20 जीबी फ़ाइल एचडीएफएस में लोड हो सके। वर्तमान में प्रक्रिया @ 4 मिनट चलती है। मैं hdfs में डेटा लोड करने के लिखने के समय में सुधार करने की कोशिश कर रहा हूं। मैं लिखने की गति में सुधार करने के लिए अलग ब्लॉक आकार का उपयोग करने की कोशिश की लेकिन नीचे दिए गए परिणामों मिला:हडोप प्रदर्शन प्रदर्शन - बड़ी फ़ाइल (20 जीबी)

512M blocksize = 4mins; 
256M blocksize = 4mins; 
128M blocksize = 4mins; 
64M blocksize = 4mins; 

किसी को भी पता है क्या अड़चन हो सकता है और अन्य विकल्पों मैं रखो cmd के प्रदर्शन में सुधार करने के लिए पता लगाने सकता है?

+0

तो यह है वर्तमान में 80 एमबी/एस। डिस्क और नेटवर्क I/O की जांच करें। क्या आपकी डिस्क/नेटवर्क बेहतर हो सकता है? आपका सटीक सेटअप क्या है? एक मशीन या क्लस्टर? – harpun

उत्तर

12

20 जीबी/4minute लगभग 85 एमबी/सेकंड तक आता है। एचडीएफएस प्रोटोकॉल और नेटवर्क के सभी ओवरहेड के साथ एक ड्राइव से अपेक्षा करने के लिए यह काफी उचित थ्रूपुट है। मैं शर्त लगा रहा हूं कि आपकी बाधा है। अपनी निगलना प्रक्रिया को बदलने के बिना, आप इसे जादुई रूप से तेज़ बनाने में सक्षम नहीं होंगे।

मूल समस्या यह है कि 20 जीबी डेटा की एक सभ्य राशि है और डेटा को एक स्ट्रीम के रूप में एचडीएफएस में धकेल दिया जा रहा है। आप डिस्क I/O द्वारा सीमित हैं जो कि बहुत लंगड़ा है क्योंकि आपके पास हैडोप क्लस्टर में बड़ी संख्या में डिस्क हैं .. आपके पास 10 गीगा नेटवर्क (और शायद 1 गीगाई) संतृप्त होने के लिए कुछ समय है।

ब्लॉक आकार बदलने से इस व्यवहार को नहीं बदला जाना चाहिए, जैसा आपने देखा था। यह अभी भी एचडीएफएस में डिस्क से डेटा की एक ही मात्रा है।

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

9

यह आपके सेटअप के विवरण पर बहुत निर्भर करता है। सबसे पहले, पता है कि 4 जीबी में 20 जीबी 80 एमबीपीएस है।

बाधा आपकी स्थानीय मशीन के हार्डवेयर या उसके ईथरनेट कनेक्शन की संभावना है। मुझे संदेह है कि ब्लॉक आकार के साथ खेलने से आपके थ्रूपुट में काफी सुधार होगा।

अपने स्थानीय मशीन एक ठेठ 7200rpm हार्ड ड्राइव नहीं है तो उसके डिस्क बफ़र होना अंतरण दर के बारे में 128MBps है, जिसका अर्थ है कि इसके बारे में 2:35 में स्मृति में है कि 20BG फ़ाइल को लोड कर सकता है, यह सोचते हैं आप अतिरिक्त 20GB की है। हालांकि, आप इसे स्मृति में कॉपी नहीं कर रहे हैं, आप इसे स्मृति से नेटवर्क पैकेट तक स्ट्रीम कर रहे हैं, इसलिए यह समझ में आता है कि इन कार्यों को संसाधित करने के लिए आपको अतिरिक्त ओवरहेड लगाना है।

wire speed पर विकिपीडिया प्रविष्टि भी देखें, जो 100 एमबी/एस (~ 12 एमबी/एस) पर एक तेज ईथरनेट सेटअप रखता है। ध्यान दें कि इस मामले में फास्ट ईथरनेट ईथरनेट मानकों के एक विशेष समूह के लिए एक शब्द है। आप स्पष्ट रूप से इस से तेज दर प्राप्त कर रहे हैं। तार की गति एक अच्छा उपाय है, क्योंकि यह आपकी स्थानीय मशीन पर सभी कारकों के लिए जिम्मेदार है।

तो चलो अपने स्थानीय मशीन पर स्ट्रीमिंग प्रक्रिया में विभिन्न चरणों को तोड़ने करते हैं:

  • फ़ाइल से एक हिस्सा पढ़ें और स्मृति में लोड। घटक: हार्ड ड्राइव, मेमोरी
  • उस खंड को पैकेट में विभाजित करें और अनुवाद करें। आखिर में मैंने सुना है कि हैडोप बॉक्स के बाहर DMA फीचर्स का उपयोग नहीं करता है, इसलिए ये ऑपरेशन एनआईसी की बजाय आपके सीपीयू द्वारा किए जाएंगे। घटक: मेमोरी, सीपीयू
  • हैडॉप फ़ाइल सर्वर पर पैकेट प्रेषित करें।घटक: एनआईसी, नेटवर्क

अपने स्थानीय मशीन के बारे में अधिक जानने के बिना, यह निर्दिष्ट करने के लिए जो इन घटकों में से टोंटी है कठिन है। हालांकि, बिटरेट की जांच शुरू करने के लिए ये जगहें हैं।

2

आप Hadoop distcp -Ddfs.block.size = $ [256 * 1024 * 1024]/path/to/inputdata/पथ distcp उपयोग कर सकते हैं// outputdata के समानांतर प्रतिलिपि प्रदर्शन करने के लिए

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