2015-10-13 3 views
9

मेरे पास 1 मास्टर (नामनोड, माध्यमिकनामोड, संसाधन प्रबंधक) और 2 दास (डेटाानोड, नोडेमनेगर) से बना एक छोटा क्लस्टर है।MapReduce2 में vcores और मेमोरी के आधार पर कंटेनर कैसे बनाए जाते हैं?

मैं गुरु के सूत-site.xml में स्थापित किया है: 512

  • yarn.scheduler.maximum-allocation-mb:: 1024
  • yarn.scheduler.minimum-allocation-vcores: 1
  • yarn.scheduler.maximum-allocation-vcores: 2
    • yarn.scheduler.minimum-allocation-mb

      मैंने दासों के यार्न-साइट.एक्सएमएल में सेट किया है:

      • yarn.nodemanager.resource.memory-mb: 2048
      • yarn.nodemanager.resource.cpu-vcores: 4

      तो मास्टर में, मैं mapred-site.xml में स्थापित किया है:

      • mapreduce.map.memory.mb: 512
      • mapreduce.map.java.opts: -Xmx500m
      • mapreduce.map.cpu.vcores: 1
      • mapreduce.reduce.memory.mb: 512
      • mapreduce.reduce.java.opts: -Xmx500m
      • mapreduce.reduce.cpu.vcores: 1

      तो यह मेरी समझ है कि जब एक नौकरी चल रहा है, mapreduce ApplicationMaster 512 एमबी की के रूप में कई कंटेनर बनाने की कोशिश करेंगे और दोनों गुलामों पर 1 vCore, जिसमें केवल 2048 एमबी और 4 vCores प्रत्येक उपलब्ध हैं, जो प्रत्येक दास पर 4 कंटेनरों के लिए जगह प्रदान करता है। यह ठीक है कि मेरी नौकरियों पर क्या हो रहा है, इसलिए अब तक कोई समस्या नहीं है।

      हालांकि, जब मैं mapreduce.map.cpu.vcores और mapreduce.reduce.cpu.vcores को 1 से 2 तक बढ़ाता हूं, तो सैद्धांतिक रूप से प्रति दास 2 कंटेनर बनाने के लिए सैद्धांतिक रूप से पर्याप्त vCores उपलब्ध होना चाहिए? लेकिन नहीं, मेरे पास अभी भी प्रति दास 4 कंटेनर हैं।

      मैंने 512 से 768 तक mapreduce.map.memory.mb और mapreduce.reduce.memory.mb को बढ़ाने की कोशिश की। यह 2 कंटेनर (2048/768 = 2) के लिए जगह छोड़ देता है।

      इससे कोई फर्क नहीं पड़ता कि vCores mappers और reducers के लिए 1 या 2 पर सेट हैं, यह हमेशा 768 एमबी के साथ प्रति गुलाम 2 कंटेनर और 512 एमबी के साथ 4 कंटेनर का उत्पादन करेगा। तो vCores के लिए क्या हैं? एप्लिकेशनमास्टर परवाह नहीं लगती है।

      इसके अलावा, जब 2 करने के लिए 768 करने के लिए स्मृति और vCores की स्थापना, मैं इस जानकारी nodemanager यूआई पर एक नक्शाकार कंटेनर के लिए प्रदर्शित किया:

      nodemanager UI screenshot

      768 एमबी 1024 TotalMemoryNeeded में बदल गया है, और 2 vCores को अनदेखा किया जाता है और 1 TotalVCores के रूप में प्रदर्शित किया जाता है।

      1. केवल स्मृति का उपयोग किया है (और vCores पर ध्यान नहीं दिया) कंटेनरों की संख्या की गणना करने के लिए:

        तो कई सवाल में "यह कैसे काम करता" सवाल तोड़ने के लिए?

      2. mapreduce.map.memory.mb कंटेनरों की संख्या की गणना के लिए केवल एक पूरी तरह से सार मूल्य है (और यही कारण है कि इसे 2 की अगली शक्ति तक गोल किया जा सकता है)? या यह किसी भी तरह से वास्तविक स्मृति आवंटन का प्रतिनिधित्व करता है?
      3. हम mapreduce.map.java.opts में कुछ -Xmx मान निर्दिष्ट क्यों करते हैं? कंटेनर को स्मृति आवंटित करने के लिए mapreduce.map.memory.mb से मान का उपयोग क्यों नहीं करते?
      4. कुल मिलाकर क्या है और यह हमेशा 1 के बराबर क्यों है? मैंने mapreduce.map.cpu.vcores को सभी नोड्स (मास्टर और दास) में बदलने की कोशिश की लेकिन यह कभी भी नहीं बदले।
    +1

    आप CapacityScheduler उपयोग करते हैं? यदि हां, तो क्या आप मुझे निम्न कॉन्फ़िगरेशन पैरामीटर के मान बता सकते हैं: yarn.scheduler.minimum-allocation-mb, yarn.scheduler.minimum-allocation-vcores, yarn.scheduler.maximum-allocation-mb, yarn.scheduler.maximum- आवंटन-vcores –

    +2

    इसके अलावा, यदि आप क्षमता शेड्यूलर का उपयोग कर रहे हैं, तो मेरा अनुमान है कि, आपका "yarn.scheduler.capacity.resource-calculator" को "org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator" पर सेट किया गया है (आप DefaultResourceCalculator का उपयोग कर रहे हैं, जो संसाधन आवश्यकताओं की गणना करते समय सीपीयू को अनदेखा करता है) –

    +0

    धन्यवाद, आप सही हैं! मुझे नहीं पता था कि विभिन्न संसाधन कैलकुलेटर थे। अब मैं अपनी क्षमता-scheduler.xml में DominantResourceCalculator का उपयोग कर रहा हूं और यह काम करता है। – Nicomak

    उत्तर

    9

    मैं इस सवाल का जवाब देंगे, इस धारणा है कि है इस्तेमाल किया अनुसूचक, CapacityScheduler पर।

    CapacityScheduler संसाधनों एक आवेदन के लिए आवश्यक की गणना के लिए ResourceCalculator उपयोग करता है।

    1. DefaultResourceCalculator:: वहाँ संसाधन कैलकुलेटर के 2 प्रकार हैं संसाधन गणना कर
    2. DominantResourceCalculator (यानी कंटेनरों की संख्या की गणना के लिए) के लिए खाते में ले जाता है, केवल स्मृति: खाते में ले जाता है, दोनों स्मृति और संसाधन की गणना के लिए सीपीयू

    डिफ़ॉल्ट रूप से, CapacityScheduler DefaultResourceCalculator उपयोग करता है। फ़ाइल आप DominantResourceCalculator का उपयोग करना चाहते हैं, तो आप "क्षमता scheduler.xml" में संपत्ति निम्नलिखित निर्धारित करने की आवश्यकता:

    <property> 
        <name>yarn.scheduler.capacity.resource-calculator</name> 
        <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value> 
        </property> 
    

    अब, आपके सवालों के जवाब:

    1. यदि डोमिनेंट रिसोर्सकुल्यूलेटर का उपयोग किया जाता है, तो कंटेनर की संख्या की गणना करने के लिए मेमोरी और वीकोर्स दोनों को ध्यान में रखा जाता है

    2. mapreduce.map.memory.mb एक अमूर्त मूल्य नहीं है। संसाधनों की गणना करते समय इसे ध्यान में रखा जाता है। (Config yarn.scheduler द्वारा निर्धारित, maximumresource (config yarn.scheduler.minimum-आवंटन-एमबी द्वारा निर्धारित)

      DominantResourceCalculator वर्ग एक सामान्य() फ़ंक्शन, जो संसाधन अनुरोध को सामान्य, minimumResouce का उपयोग कर है । अधिकतम-आवंटन-एमबी) और एक चरण कारक (कॉन्फ़िगर yarn.scheduler.minimum-आवंटन-एमबी द्वारा निर्धारित)।

      स्मृति को सामान्य के लिए नीचे दिए गए कोड की तरह दिखता है (org.apache.hadoop.yarn.util.resource.DominantResourceCalculator.java की जाँच करें):

      int normalizedMemory = Math.min(roundUp(
      Math.max(r.getMemory(), minimumResource.getMemory()), 
      stepFactor.getMemory()),maximumResource.getMemory()); 
      

    कहाँ:

    r = अनुरोध किया मेमोरी

    तर्क नीचे जैसा काम करता है:

    ए। अधिकतम (अनुरोधित संसाधन और न्यूनतम संसाधन) = अधिकतम (768, 512) = 768

    बी। राउंड-अप (768, StepFactor) = राउंडअप (768, 512) == 1279 (लगभग)

    Roundup does : ((768 + (512 -1))/512) * 512 
    

    सी। मिनट (राउंडअप (512, stepFactor), maxresource) = मिनट (1279, 1024) = 1024

    तो आखिरकार, आवंटित स्मृति 1024 एमबी है, जो आपको मिल रही है।

    सादगी के लिए, आपको लगता है कि राउंडअप कह सकते हैं, 512 एमबी की चरणों में मांग (जो एक minimumresource है)

    वृद्धि कर देता है
    1. के बाद से मैपर एक जावा प्रक्रिया है , mapreduce.map.java.opts का उपयोग मैपर के ढेर आकार को निर्दिष्ट करने के लिए किया जाता है।

    कहाँ के रूप में mapreduce.map.memory.mb कुल कंटेनर द्वारा प्रयुक्त स्मृति है।

    mapreduce.map.java.opts का मूल्य की तुलना में कम mapreduce.map.memory.mb होना चाहिए

    जवाब यहां बताते हैं कि: What is the relation between 'mapreduce.map.memory.mb' and 'mapred.map.child.java.opts' in Apache Hadoop YARN?

    1. जब आप डोमिनेंट रिसोर्सकलक्यूलेटर का उपयोग करते हैं, तो यह आवश्यक vCores की गणना करने के लिए सामान्यीकृत() फ़ंक्शन का उपयोग करता है।

      उस के लिए कोड (स्मृति को सामान्य के समान) है:

      int normalizedCores = Math.min(roundUp 
      ` Math.max(r.getVirtualCores(), minimumResource.getVirtualCores()), 
          stepFactor.getVirtualCores()), maximumResource.getVirtualCores()); 
      
    संबंधित मुद्दे