কিভাবে অ্যাপাচি স্পার্ক এক্সিকিউটার মেমরি সেট করবেন


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

ইউআই দেখায় যে এই পরিবর্তনশীলটি স্পার্ক পরিবেশে সেট করা আছে। আপনি এখানে স্ক্রিনশট পেতে পারেন

তবে আমি যখন এক্সিকিউটর ট্যাবে যাই তখন আমার একক এক্সিকিউটারের জন্য মেমরি সীমাটি 265.4 এমবিতে সেট করা থাকে। আমি এখনও একই ত্রুটি পেতে।

আমি এখানে উল্লিখিত বিভিন্ন জিনিস চেষ্টা করেছিলাম কিন্তু তবুও ত্রুটিটি পেয়েছি এবং আমার কোথায় সেটিংস পরিবর্তন করা উচিত সে সম্পর্কে একটি পরিষ্কার ধারণা নেই।

আমি স্পার্ক-শেল থেকে আমার কোড ইন্টারেক্টিভ চালাচ্ছি

উত্তর:


185

যেহেতু আপনি স্থানীয় মোডে স্পার্ক চালাচ্ছেন, সেটিংয়ের spark.executor.memoryকোনও প্রভাব থাকবে না, যেমনটি আপনি লক্ষ্য করেছেন। এই জন্য কারণ যে চালক জেভিএম প্রক্রিয়া মধ্যে ওয়ার্কার "জীবন" যে আপনি শুরু হয় যখন আপনি শুরু স্ফুলিঙ্গ-শেল এবং ডিফল্ট যে জন্য ব্যবহৃত স্মৃতি 512M । আপনি সেট করে এটি বাড়াতে পারেনspark.driver.memory , উচ্চ কিছু উদাহরণস্বরূপ 5g । আপনি যে কোনও মাধ্যমে এটি করতে পারেন:

  • এটিকে বৈশিষ্ট্য ফাইলে সেট করা (ডিফল্ট হয় $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

সুতরাং সচেতন হোন যে পুরো পরিমাণ ড্রাইভার মেমরি আরডিডি স্টোরেজের জন্য উপলব্ধ হবে না।

তবে আপনি যখন এটি কোনও ক্লাস্টারে চালানো শুরু spark.executor.memoryকরবেন তখন স্পার্কের স্মৃতি ক্যাশে উত্সর্গ করার পরিমাণ গণনা করার সময় সেটিংসটি গ্রহণ করবে।


1
5 জি কি 5 জিবি সমান?
চক

@ চাক স্পার্ক.এপাচি.অর্গ.ডোকস / স্লেস্ট / "ড্রাইভার প্রসেসের জন্য ব্যবহারের জন্য মেমরির পরিমাণ, যেখানে স্পার্ককন্টেক্সট সূচনা করা হয়েছে, সেই আকারের ইউনিট প্রত্যয়যুক্ত জেভিএম মেমরি স্ট্রিংয়ের একই বিন্যাসে (" কে "," এম) "," জি "বা" টি ") (উদাঃ 512 মি, 2 জি)"
জেমস মুর

39

আরও মনে রাখবেন, স্থানীয় মোডের জন্য আপনাকে jvm শুরু করার আগে ড্রাইভারের মেমরির পরিমাণ নির্ধারণ করতে হবে:

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

এটি JVM ডিফল্ট 512M এর পরিবর্তে 2G দিয়ে শুরু করবে।
বিশদ এখানে :

স্থানীয় মোডের জন্য আপনার কাছে কেবলমাত্র একজন নির্বাহক থাকবেন এবং এই নির্বাহক আপনার ড্রাইভার, সুতরাং পরিবর্তে আপনাকে ড্রাইভারের স্মৃতি সেট করতে হবে need * এটি বলেছিল, স্থানীয় মোডে, আপনি স্পার্ক-সাবমিশন চালানোর সময়, একটি জেভিএম ইতিমধ্যে ডিফল্ট মেমরি সেটিংস সহ চালু করা হয়েছে, সুতরাং আপনার কনফিডে "spark.driver.memory" সেট করা আপনার পক্ষে আসলে কিছুই করবে না। পরিবর্তে, আপনাকে নীচের মতো স্পার্ক-জমা চালানো দরকার run


5

স্পষ্টতই, প্রশ্নটি কখনও সূত্রে নয় স্থানীয় মোডে চালানোর জন্য বলে। কোনওভাবেই আমি স্পার্ক-ডিফল্ট.কম কাজ করতে পারিনি। পরিবর্তে আমি এটি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করে

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

(ক্যান্টবাম্প এক্সিকিউটার-মেমরি 8 জি তে সুতা কনফিগারেশন থেকে কিছুটা নিষেধাজ্ঞা রয়েছে is)


ওপিতে উল্লেখ করা হয়েছে যে তিনি একটি একক মেশিন ব্যবহার করছেন।
শারিক আবদুল্লাহ

আপনি কি 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

আপনাকে ড্রাইভারের স্মৃতি বাড়াতে হবে O ম্যাকের (যেমন স্থানীয় মাস্টারে চলার সময়) ডিফল্ট ড্রাইভার-মেমরিটি 1024 এম) M ডিফল্টরূপে, এভাবে 380Mb নির্বাহকের কাছে বরাদ্দ করা হয়।

স্ক্রিনশট

[ --ড্রাইভার-মেমরি 2 জি ] বাড়ানোর পরে , এক্সিকিউটারের মেমরিটি 950Mb ডলারে উন্নীত হয়েছে। এখানে চিত্র বর্ণনা লিখুন


2

স্পার্ক / কনফার্ট ডিরেক্টরিতে spark-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রান রান সময়ে এটি পরিবর্তন করা সম্ভব হবে না । আপনি যদি পাইপার্ক এবং গ্রাফ্রেমগুলি সহ একা একা সংস্করণ চালাচ্ছেন REPLতবে নিম্নলিখিত কমান্ডটি প্রয়োগ করে আপনি পাইপর্কটি চালু করতে পারেন :

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

SPARK_VERSIONস্পার্কের সর্বশেষ প্রকাশিত সংস্করণ সম্পর্কিত উপযুক্তভাবে পরিবেশের পরিবর্তনশীল পরিবর্তন করতে ভুলবেন না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.