Apache Spark Executor मैमोरी कैसे सेट करें


127

मैं अपाचे स्पार्क एक्सेसर नोड्स के लिए उपलब्ध मेमोरी कैसे बढ़ा सकता हूं?

मेरे पास 2 जीबी की फाइल है जो अपाचे स्पार्क में लोड करने के लिए उपयुक्त है। मैं 1 मशीन पर इस समय के लिए अपाचे स्पार्क चला रहा हूं, इसलिए ड्राइवर और निष्पादक एक ही मशीन पर हैं। मशीन में 8 जीबी मेमोरी है।

जब मैं फ़ाइल की पंक्तियों को गिनने की कोशिश करता हूं, तो फ़ाइल को मेमोरी में कैश्ड होने के बाद मैं इन त्रुटियों को प्राप्त करता हूं:

2014-10-25 22:25:12 WARN  CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.

मैं प्रलेखन को देखा यहाँ और सेट spark.executor.memoryकरने के लिए 4gमें$SPARK_HOME/conf/spark-defaults.conf

UI दिखाता है कि यह चर स्पार्क पर्यावरण में सेट है। आप यहाँ स्क्रीनशॉट पा सकते हैं

हालाँकि जब मैं एक्ज़ीक्यूटर टैब पर जाता हूँ तो मेरे एक्ज़ीक्यूटर की मेमोरी लिमिट अभी भी २६५.४ एमबी है। मुझे अब भी वही त्रुटि मिलती है।

मैंने यहां बताई गई विभिन्न चीजों की कोशिश की, लेकिन मुझे अभी भी त्रुटि मिलती है और मुझे स्पष्ट विचार नहीं है कि मुझे सेटिंग कहां बदलनी चाहिए।

मैं स्पार्क-शेल से अंतःक्रियात्मक रूप से अपना कोड चला रहा हूं

जवाबों:


185

चूंकि आप स्पार्क को स्थानीय मोड में चला रहे हैं, इसलिए सेटिंग spark.executor.memoryपर कोई प्रभाव नहीं पड़ेगा, जैसा कि आपने देखा है। इसका कारण यह है कि वर्कर ड्राइवर JVM प्रक्रिया के भीतर "रहता है" जिसे आप स्पार्क-शेल शुरू करते हैं और इसके लिए उपयोग की गई डिफ़ॉल्ट मेमोरी 512M है । आप इसे बढ़ाकर spark.driver.memoryकुछ और बढ़ा सकते हैं , उदाहरण के लिए 5 जी । आप ऐसा कर सकते हैं:

  • इसे गुण फ़ाइल में सेट करना (डिफ़ॉल्ट है $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • या रनटाइम पर कॉन्फ़िगरेशन सेटिंग की आपूर्ति करके

    $ ./bin/spark-shell --driver-memory 5g
    

ध्यान दें कि इसे एप्लिकेशन में सेट करके प्राप्त नहीं किया जा सकता है, क्योंकि यह पहले से ही बहुत देर हो चुकी है, कुछ स्मृति के साथ प्रक्रिया पहले ही शुरू हो चुकी है।

265.4 एमबी का कारण यह है कि स्पार्क स्टोरेज मेमोरी की कुल मात्रा में स्पार्क.स्टोरीजिमोरीफ्रेम * स्पार्क.स्टोरी.सैफिलिफ्टर को समर्पित करता है और डिफ़ॉल्ट रूप से वे 0.6 और 0.9 हैं।

512 MB * 0.6 * 0.9 ~ 265.4 MB

तो ध्यान रहे कि RDD स्टोरेज के लिए ड्राइवर मेमोरी की पूरी मात्रा उपलब्ध नहीं होगी।

लेकिन जब आप इसे एक क्लस्टर पर चलाना शुरू करेंगे, तो spark.executor.memoryस्पार्क की मेमोरी कैश को समर्पित करने के लिए राशि की गणना करते समय सेटिंग समाप्त हो जाएगी।


1
5 जी 5 जी बी के बराबर है?
चक

@Chuck स्पार्क .apache.org/ docs/ latest/ "ड्राइवर प्रक्रिया के लिए उपयोग की जाने वाली मेमोरी की मात्रा, यानी जहां स्पार्ककॉन्टेक्स्ट को इनिशियलाइज़ किया गया है, उसी आकार में JVM मेमोरी स्ट्रिंग्स के साथ एक साइज़ यूनिट रीक्स (" k "," m) "," जी "या" टी ") (जैसे 512 मीटर, 2 जी)।"
जेम्स मूर

39

यह भी ध्यान दें, कि स्थानीय मोड के लिए आपको jvm शुरू करने से पहले ड्राइवर मेमोरी की मात्रा निर्धारित करनी होगी:

bin/spark-submit --driver-memory 2g --class your.class.here app.jar

यह डिफ़ॉल्ट 512M के बजाय 2G के साथ JVM शुरू करेगा। यहाँ
विवरण :

स्थानीय मोड के लिए आपके पास केवल एक निष्पादक है, और यह निष्पादक आपका ड्राइवर है, इसलिए आपको इसके बजाय ड्राइवर की मेमोरी सेट करने की आवश्यकता है। * कहा कि, स्थानीय मोड में, जब तक आप स्पार्क-सबमिट करते हैं, तब तक डिफ़ॉल्ट मेमोरी सेटिंग्स के साथ एक जेवीएम पहले ही लॉन्च हो चुका होता है, इसलिए आपके स्पार्क में "स्पार्क.डायवर मॉरीमोरी" सेट करना वास्तव में आपके लिए कुछ नहीं करेगा। इसके बजाय, आपको निम्नानुसार स्पार्क-सबमिट चलाने की आवश्यकता है


5

जाहिर है, सवाल कभी नहीं स्थानीय मोड पर चलने के लिए कहते हैं यार्न पर नहीं। किसी तरह मैं काम करने के लिए चिंगारी- default.conf परिवर्तन प्राप्त नहीं कर सका। इसके बजाय मैंने यह कोशिश की और यह मेरे लिए काम कर गया

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(8g करने के लिए bump निष्पादक-मेमोरी नहीं कर सकता है, यार्न कॉन्फ़िगरेशन से कुछ प्रतिबंध है।)


ओपी उल्लेख करता है कि वह एक मशीन का उपयोग कर रहा है।
शरीक अब्दुल्ला

आप की executor-memoryतुलना में अधिक है driver-memory?
निमरेसम

5

ग्रीगा द्वारा प्रस्तुत जवाब से मुझे अपने मुद्दे को हल करने में मदद मिली। मैं एक डॉकटर कंटेनर के अंदर एक अजगर स्क्रिप्ट से स्थानीय रूप से स्पार्क चला रहा हूं। प्रारंभ में मुझे स्पार्क में कुछ डेटा को संसाधित करते समय एक जावा आउट-ऑफ-मेमोरी त्रुटि मिल रही थी। हालाँकि, मैं अपनी स्क्रिप्ट में निम्न पंक्ति जोड़कर अधिक मेमोरी असाइन करने में सक्षम था:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

यहाँ अजगर लिपि का पूरा उदाहरण दिया गया है जिसका उपयोग मैं स्पार्क शुरू करने के लिए करता हूँ:

import os
import sys
import glob

spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = spark_home 

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.zip")):
    sys.path.insert(0,lib);

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
    driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
    +driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
    +driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
    +driver_home+'/mongo/mongo-java-driver-3.8.0.jar') 

sc = SparkContext.getOrCreate(conf)

spark = SQLContext(sc)

4

आपको ड्राइवर मेमोरी बढ़ाने की आवश्यकता है। मैक (यानी स्थानीय मास्टर पर चलने पर), डिफ़ॉल्ट ड्राइवर-मेमोरी 1024M है)। डिफ़ॉल्ट रूप से, 380Mb को निष्पादक को आवंटित किया जाता है।

स्क्रीनशॉट

[ --Driver- मेमोरी 2G ] बढ़ने पर, निष्पादक मेमोरी बढ़कर ~ 950Mb हो गई। यहाँ छवि विवरण दर्ज करें


2

स्पार्क / कन्फर्म डायरेक्टरी में स्पार्क-env.sh नामक फाइल बनाएं और इस लाइन को जोड़ें

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor

1
वास्तव में, मैं मास्टर को कंक्रीट कॉन्फिगर के साथ चलाता हूं, मुझे स्पार्क कमांड चलाने के लिए हर बार विकल्पों को जोड़ने की आवश्यकता नहीं होगी। लेकिन यह केवल क्लस्टर नोड के लिए है, मामले में यह सेटिंग है SPARK_WORKER_MEMORY
इव्ज २३'१

1

आप निम्न उदाहरण का उपयोग करके कमांड का निर्माण कर सकते हैं

 spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 

1

अपने ड्राइवर प्रोग्राम द्वारा दिए गए निर्देशों के आधार पर स्पार्क निष्पादक मेमोरी आपके स्पार्क कार्यों को चलाने के लिए आवश्यक है। मूल रूप से, इसके लिए अधिक संसाधनों की आवश्यकता होती है जो आपकी प्रस्तुत नौकरी पर निर्भर करता है।

निष्पादन मेमोरी में कार्यों को निष्पादित करने के लिए आवश्यक मेमोरी शामिल है ओवरहेड मेमोरी जो जेवीएम और यार्न कंटेनर के आकार से अधिक नहीं होनी चाहिए।

स्पार्क-डिफॉल्ट्स.कॉनफ में निम्नलिखित पैरामीटर जोड़ें

spar.executor.cores=1

spark.executor.memory=2g

यदि आप क्लाउड प्रबंधक या अम्बारी जैसे किसी भी क्लस्टर प्रबंधन टूल का उपयोग कर रहे हैं, तो कृपया क्लस्टर में सभी नोड्स के लिए नवीनतम कॉन्फ़िगरेशन को प्रतिबिंबित करने के लिए क्लस्टर कॉन्फ़िगरेशन को ताज़ा करें।

वैकल्पिक रूप से, हम एग्जिक्यूटिव कोर और मेमोरी वैल्यू को एक तर्क के रूप में पास कर सकते हैं, जबकि spark-submitक्लास और एप्लिकेशन पाथ के साथ कमांड रन कर सकते हैं ।

उदाहरण:

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000

0

आपने उल्लेख किया है कि आप स्पार्क-शेल पर अंतःक्रियात्मक रूप से अपनाकोड चला रहे हैं, जबकि ऐसा करते समय यदि ड्राइवर-मेमोरी या निष्पादक मेमोरी के लिए कोई उचित मान निर्धारित नहीं है, तो स्पार्क डिफ़ॉल्ट रूप से इसके लिए कुछ मान असाइन करता है, जो कि गुण फ़ाइल पर आधारित है (जहां डिफ़ॉल्ट मान है) उल्लेख किया जा रहा है)।

मुझे आशा है कि आप इस तथ्य से अवगत हैं कि एक ड्राइवर (मास्टर नोड) और कार्यकर्ता-नोड (जहां निष्पादक बनाए और संसाधित किए जाते हैं), इसलिए मूल रूप से स्पार्क प्रोग्राम द्वारा दो प्रकार के स्थान की आवश्यकता होती है, इसलिए यदि आप सेट करना चाहते हैं ड्राइवर मेमोरी तब जब स्पार्क-शेल शुरू करें।

चिंगारी-खोल - मेमोरी-मेमोरी "आपका मूल्य" और निष्पादक मेमोरी सेट करने के लिए: स्पार्क-शेल - एक्सीलोर-मेमोरी "आपके कंप्यूटर"

फिर मुझे लगता है कि आप उस मेमोरी के वांछित मूल्य के साथ जाना अच्छा है जिसे आप अपनी स्पार्क-शेल का उपयोग करना चाहते हैं।


0
spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000


0

जहां तक ​​मुझे पता है कि spark.executor.memoryरन टाइम में बदलाव करना संभव नहीं होगा । यदि आप pyspark और ग्राफफ्रेम के साथ एक स्टैंड-अलोन संस्करण चला रहे हैं, तो आप REPLनिम्न कार्य निष्पादित करके pyspark लॉन्च कर सकते हैं :

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

SPARK_VERSIONस्पार्क के नवीनतम जारी संस्करण के बारे में उचित रूप से पर्यावरण चर को बदलना सुनिश्चित करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.