স্পর্শ করুন java.lang.OutOfMemoryError: জাভা হ্যাপ স্পেস


228

আমার ক্লাস্টার: 1 মাস্টার, 11 ক্রীতদাস, প্রতিটি নোডে 6 জিবি মেমরি রয়েছে।

আমার সেটিংস:

spark.executor.memory=4g, Dspark.akka.frameSize=512

সমস্যাটি এখানে:

প্রথমত , আমি এইচডিএফএস থেকে আরডিডি থেকে কিছু ডেটা (২.১৯ গিগাবাইট) পড়েছি:

val imageBundleRDD = sc.newAPIHadoopFile(...)

দ্বিতীয়ত , এই আরডিডিতে কিছু করুন:

val res = imageBundleRDD.map(data => {
                               val desPoints = threeDReconstruction(data._2, bg)
                                 (data._1, desPoints)
                             })

শেষ , এইচডিএফএস এ আউটপুট:

res.saveAsNewAPIHadoopFile(...)

আমি যখন আমার প্রোগ্রামটি চালিত করি তখন এটি দেখায়:

.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space

অনেক কাজ আছে?

PS : ইনপুট ডেটা প্রায় 225 মেগাবাইট থাকা অবস্থায় প্রতিটি জিনিসই ঠিক থাকে।

কিভাবে আমি এই সমস্যার সমাধান করতে পারে?


কিভাবে স্পার্ক চালাতে হবে? এটি কনসোল থেকে এসেছে? অথবা আপনি কোন স্ক্রিপ্ট ব্যবহার করেন?
টম্বার্ট

আমি আমার অ্যাপ্লিকেশনটি সংকলন করতে এবং চালাতে sbt ব্যবহার করি। sbt প্যাকেজ তারপর sbt রান। আমি এক মাস আগে হাদুপে একই প্রোগ্রামটি বাস্তবায়ন করেছি এবং আমি আউটঅফমিউরিওরার একই সমস্যার মুখোমুখি হয়েছিলাম, তবে হ্যাডোপে এটি এক্সপ্লিকেশন থেকে এক্সএমএক্স ২০০ এম থেকে এক্সএমএক্স ৪০০ মি পর্যন্ত মানচিত্রেড.চাইল্ড.জভা.ওপটিসের মান বাড়িয়ে সহজেই সমাধান করা যেতে পারে। স্পার্কের কোনও কাজের জন্য jvm সেটিংস আছে? আমি ভাবছি স্পার্ক.এক্সেকিউটার.মেমরি হ্যাডুপে ম্যাপ্রেড.চাইল্ড.জভা.ওপটসের মত একই অর্থ। আমার প্রোগ্রামে spark.executor.memory ইতোমধ্যে হাদুপে Xmx400m এর চেয়ে 4g তে সেট করা হয়েছে। আপনাকে ধন্যবাদ
he

আপনি যে তিনটি পদক্ষেপের কথা উল্লেখ করেছেন কেবল সেগুলিই কি আপনি করছেন? (Data._1, desPoints) দ্বারা উত্পন্ন dataa আকার কী - এই মেমরি মাপসই করা উচিত ESP যদি এই তথ্য তারপর অন্য ধাপে এলোমেলো হয়
অর্ণোন Rotem-গালা-অজ

1
ড্রাইভারের জন্য মেমরির কনফিগারেশন কী? কোন সার্ভারটি মেমরির ত্রুটি থেকে বেরিয়ে আসে তা পরীক্ষা করুন। এটি চালক বা নির্বাহকের একজন।
রানপ

সমস্ত কনফিগারেশন বৈশিষ্ট্য এখানে দেখুন: spark.apache.org/docs/2.1.0/configration.html
নরমসিম

উত্তর:


363

আমি কয়েকটি পরামর্শ আছে:

  • যদি আপনার নোডগুলি স্পার্কের জন্য সর্বাধিক 6 জি থাকতে কনফিগার করা থাকে (এবং অন্যান্য প্রক্রিয়াগুলির জন্য কিছুটা রেখে যায়) তবে 4g, 6 এর পরিবর্তে 6g ব্যবহার করুন spark.executor.memory=6g। আপনি ইউআই পরীক্ষা করে যতটা সম্ভব মেমোরি ব্যবহার করছেন তা নিশ্চিত করুন (আপনি কতটা মেমো ব্যবহার করছেন তা এটি বলবে)
  • আরও পার্টিশন ব্যবহার করে দেখুন, আপনার প্রতি সিপিইউতে 2 - 4 হওয়া উচিত। পার্টিশনের সংখ্যা বাড়ানো আইএমই প্রায়শই একটি প্রোগ্রাম আরও স্থিতিশীল করার সবচেয়ে সহজ উপায় (এবং প্রায়শই দ্রুত)। বিপুল পরিমাণ ডেটার জন্য আপনার সিপিইউতে 4 টিরও বেশি উপায়ের প্রয়োজন হতে পারে, আমাকে কিছু ক্ষেত্রে 8000 পার্টিশন ব্যবহার করতে হয়েছিল!
  • ক্যাশে , ব্যবহারের জন্য সংরক্ষিত মেমরির ভগ্নাংশ হ্রাস করুন spark.storage.memoryFraction। আপনি যদি cache()বা persistআপনার কোড ব্যবহার না করেন তবে এটি 0 টিও হতে পারে It's এটির ডিফল্ট 0.6 হয়, যার অর্থ আপনি নিজের গাদা জন্য কেবল 0.4 * 4 জি মেমরি পান। আইএমই মেম ফ্র্যাক হ্রাস করার ফলে প্রায়শই ওওএম দূরে চলে যায়। আপডেট: স্পার্ক ১.6 থেকে স্পষ্টতই আমাদের আর এই মানগুলি নিয়ে খেলতে হবে না, স্পার্কটি সেগুলি স্বয়ংক্রিয়ভাবে নির্ধারণ করবে।
  • উপরের মত তবে মেমরি ভগ্নাংশ সাফ করুন । যদি আপনার কাজের খুব বেশি বদলানো মেমরির প্রয়োজন না হয় তবে এটি একটি কম মানতে সেট করুন (এটি আপনার শাফলগুলি ডিস্কে ছড়িয়ে দিতে পারে যা গতির উপর বিপর্যয়কর প্রভাব ফেলতে পারে)। কখনও কখনও যখন এটি ওফিং হয় এমন কোনও শ্যাফেল অপারেশন আপনার বিপরীতটি করা দরকার অর্থাত্ এটি 0.8 এর মতো বড় কিছুতে সেট করতে হবে বা নিশ্চিত করুন যে আপনি আপনার শাফলগুলি ডিস্কে ছড়িয়ে দিতে দিয়েছেন (এটি 1.0.0 এর পরে ডিফল্ট)।
  • মেমরি ফাঁসের জন্য সতর্কতা অবলম্বন করুন, এগুলি প্রায়শই দুর্ঘটনাক্রমে আপনার ল্যাম্বডাসে আপনার প্রয়োজন না এমন বস্তুগুলি বন্ধ করে দেয়। রোগ নির্ণয়ের উপায়টি লগগুলিতে "XXX বাইট হিসাবে সিরিয়ালযুক্ত টাস্ক" সন্ধান করা, যদি XXX কয়েক কে বা এমবি থেকে বেশি হয় তবে আপনার মেমরি ফুটো হতে পারে। Https://stackoverflow.com/a/25270600/1586965 দেখুন
  • উপরে সম্পর্কিত; আপনার যদি সত্যই বড় বস্তুর প্রয়োজন হয় তবে সম্প্রচারের ভেরিয়েবলগুলি ব্যবহার করুন ।
  • আপনি যদি বড় আরডিডি ক্যাচ করে থাকেন এবং কিছু অ্যাক্সেস সময় ত্যাগ করতে পারেন তবে আরডিডি সিরিয়ালকরণের কথা বিবেচনা করুন http://spark.apache.org/docs/latest/tuning.html#serialized-rdd-stores । অথবা এমনকি তাদের ডিস্কে ক্যাশে করা (যা এসএসডি ব্যবহার করে যা কখনও কখনও খারাপ হয় না)।
  • ( উন্নত ) উপরের সম্পর্কিত, এড়ানো Stringএবং ভারী নেস্টেড স্ট্রাকচারগুলি (যেমন Mapএবং নেস্টেড কেস ক্লাস) এড়ানো । যদি সম্ভব হয় তবে কেবলমাত্র আদিম প্রকারগুলি এবং সমস্ত অ-আদিমকে সূচকগুলি ব্যবহার করার চেষ্টা করুন বিশেষত যদি আপনি প্রচুর নকল আশা করেন। WrappedArrayযখনই সম্ভব নেস্টেড স্ট্রাকচারগুলি বেছে নিন । অথবা এমনকি আপনার নিজস্ব সিরিয়ালাইজেশন রোল আউট করুন - কীভাবে আপনার ডেটা বায়সে দক্ষতার সাথে ফিরিয়ে আনতে হবে আপনার সর্বাধিক তথ্য থাকবে, এটি ব্যবহার করুন !
  • ( বিট হ্যাকি ) আবার Datasetক্যাশ করার সময় আপনার কাঠামোকে ক্যাশে রাখতে একটি ব্যবহার করার বিষয়টি বিবেচনা করুন কারণ এটি আরও দক্ষ সিরিয়ালাইজেশন ব্যবহার করবে। পূর্ববর্তী বুলেট পয়েন্টের সাথে তুলনা করার সময় এটি হ্যাক হিসাবে বিবেচিত হওয়া উচিত। আপনার অ্যালগো / সিরিয়ালাইজেশনে আপনার ডোমেন জ্ঞান তৈরি করা 100x বা 1000x দ্বারা মেমরি / ক্যাশে-স্পেসকে ন্যূনতম করতে পারে, যেখানে সমস্তগুলি Datasetসম্ভবত 2x - 5x মেমরি এবং ডিস্কে 10x সংকোচিত (parquet) দেয়।

http://spark.apache.org/docs/1.2.1/configuration.html

সম্পাদনা: (সুতরাং আমি নিজেকে আরও সহজে গুগল করতে পারি) নিম্নলিখিতগুলিও এই সমস্যার ইঙ্গিত দেয়:

java.lang.OutOfMemoryError : GC overhead limit exceeded

আপনার পরামর্শের জন্য ধন্যবাদ ~ আমি যদি স্পার্ক.এক্সেকিউটার.মেমোরি = 6 জি সেট করি তবে স্পার্কের সমস্যা হবে: "কর্মীরা নিবন্ধিত রয়েছে এবং পর্যাপ্ত স্মৃতিশক্তি রয়েছে তা নিশ্চিত করতে আপনার ক্লাস্টার ইউআই পরীক্ষা করুন"। স্পার্ক.স্টোরেজ.মোমরিফ্রাকশন 0.1 এ সেট করা সমস্যার সমাধান করতে পারে না। সমস্যাটি আমার কোডে রয়েছে lies ধন্যবাদ আপনাকে!
hequn8128

2
@ সাম্তেবেস্ট এটি একটি দুর্দান্ত উত্তর। মেমরি ফাঁস সন্ধানের জন্য আমি লগিং সহায়তাটি সত্যই প্রশংসা করি।
মাইলস বেকার

1
হাই হাই সামষ্টেবেস্ট আপনি কীভাবে 8000 পার্টিশন নির্দিষ্ট করেছেন? যেহেতু আমি স্পার্ক এসকিএল ব্যবহার করছি আমি কেবল স্পার্ক.এসকিএল.শ্যাফেল. পার্টিশন ব্যবহার করে পার্টিশনটি নির্দিষ্ট করতে পারি, তাই ডিফল্ট মান 200 এর চেয়ে বেশি সেট করা উচিত আমি এটি 1000 এ সেট করার চেষ্টা করেছি তবে ওওএম পাওয়ার ক্ষেত্রে সহায়তা দিচ্ছে না আপনি কী জানেন কী সর্বোত্তম হওয়া উচিত? পার্টিশন মানটির প্রক্রিয়াকরণের জন্য আমার কাছে 1 টিবি স্কিউড ডেটা রয়েছে এবং এতে মধুযন্ত্রগুলি জিজ্ঞাসা করে গ্রুপ জড়িত। গাইড করুন।
উমেশ কে

2
হাই @ user449355 দয়া করে আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন? দীর্ঘক্ষণ একটি মন্তব্য থ্রেড শুরু করার ভয়ে :) আপনার যদি সমস্যা হয় তবে সম্ভবত অন্য ব্যক্তিরাও হন এবং একটি প্রশ্ন সকলের জন্য এটি সহজ করে তোলে easier
সামতিবেস্ট

1
আপনার প্রথম বক্তব্য, @ সামিটবেস্ট, আপনার সমস্ত স্মৃতি ব্যবহার করা উচিত নয় spark.executor.memoryকারণ আপনার অবশ্যই I / O ওভারহেডের জন্য কিছু পরিমাণ মেমরির প্রয়োজন। আপনি যদি এটির সমস্ত ব্যবহার করেন তবে এটি আপনার প্রোগ্রামকে ধীর করে দেবে। এর ব্যতিক্রম হতে পারে ইউনিক্স, এক্ষেত্রে আপনার কাছে অদলবদল স্থান রয়েছে।
হুনলে

58

এই যে প্রায়ই আলোচনা না করার জন্য একটি ব্যবহারের ক্ষেত্রে যোগ করার জন্য, আমি যখন একটি জমা দেওয়ার একটি সমাধান জাহির করা হবে Sparkমাধ্যমে আবেদন spark-submitমধ্যে স্থানীয় মোড।

জেসেক লাসকভস্কি রচিত গিটিংবুক মাস্টারিং অ্যাপাচি স্পার্ক অনুসারে :

আপনি স্থানীয় মোডে স্পার্ক চালাতে পারেন। এই অ-বিতরণকৃত একক-জেভিএম ডিপ্লোয়মেন্ট মোডে স্পার্ক একই জেভিএম-তে চালক, এক্সিকিউটার, ব্যাকএন্ড এবং মাস্টার - এর সমস্ত নির্বাহী উপাদান তৈরি করে। এটিই একমাত্র মোড যেখানে চালক কার্যকর করার জন্য ব্যবহৃত হয়।

সুতরাং, যদি আপনি এর OOMসাথে ত্রুটিগুলি অনুভব করছেন তবে heapএটির driver-memoryপরিবর্তে সামঞ্জস্য করা যথেষ্ট executor-memory

এখানে একটি উদাহরণ:

spark-1.6.1/bin/spark-submit
  --class "MyClass"
  --driver-memory 12g
  --master local[*] 
  target/scala-2.10/simple-project_2.10-1.0.jar 

একা মোডে ড্রাইভার মেমরির জন্য আমাদের কত শতাংশ বিবেচনা করা উচিত।
যশোবন্ত কম্বালা

@ ব্রায়ান, স্থানীয় মোডে, ড্রাইভার মেমরির কি ইনপুট ডেটার আকারের চেয়ে বড় হওয়া দরকার? ইনপুট ডেটাসেটের জন্য পার্টিশনের সংখ্যা নির্দিষ্ট করা কি সম্ভব, সুতরাং স্পার্ক কাজটি উপলব্ধ র‌্যামের চেয়ে অনেক বড় ডেটাসেটের সাথে কাজ করতে পারে?
ফুয়ি

19

আপনার নীচে প্রদর্শিত হিসাবে অফ হিপ মেমরি সেটিংস কনফিগার করা উচিত:

val spark = SparkSession
     .builder()
     .master("local[*]")
     .config("spark.executor.memory", "70g")
     .config("spark.driver.memory", "50g")
     .config("spark.memory.offHeap.enabled",true)
     .config("spark.memory.offHeap.size","16g")   
     .appName("sampleCodeForReference")
     .getOrCreate()

আপনার মেশিনের র্যাম প্রাপ্যতা অনুসারে ড্রাইভার মেমরি এবং এক্সিকিউটারের মেমরি দিন। আপনি যদি এখনও অফফিমোরি সমস্যাটির মুখোমুখি হন তবে আপনি অফহীপ আকার বাড়িয়ে তুলতে পারেন


অফ হিপ সেটিং সাহায্য করেছে
kennyut

2
আপনার কোডে ড্রাইভারের মেমরি সেট করা কাজ করবে না, এর জন্য স্পার্ক ডকুমেন্টেশন পড়ুন: স্পার্কের বৈশিষ্ট্যগুলি সাধারণত দুটি ধরণের মধ্যে বিভক্ত করা যায়: একটি "স্থাপনার সাথে সম্পর্কিত," স্পার্ক.ড্রাইভার.মেমরি "," স্পার্ক.এক্সেকিউটার ইন্টিস্ট্যান্স "এর মতো, রানটাইমের সময় স্পারকনফের মাধ্যমে প্রোগ্রামগতভাবে সেট করার সময় এই ধরণের বৈশিষ্ট্যগুলি প্রভাবিত হতে পারে না বা আচরণটি নির্ভর করে আপনি কোন ক্লাস্টার ম্যানেজার এবং মোছা মোডটি নির্বাচন করেন, তাই এটি কনফিগারেশন ফাইলের মাধ্যমে সেট করার পরামর্শ দেওয়া হবে বা স্পার্ক-সাবমিট কমান্ড লাইন বিকল্পগুলি।
আবদুলহাফেত সারতাবি

1
সেরা উত্তর! আমার সমস্যাটি ছিল যে স্পার্ক মাস্টার নোডে ইনস্টল করা হয়নি, আমি এইচডিএফএসের সাথে সংযোগ করার জন্য পাইসপার্কটি ব্যবহার করেছি এবং একই ত্রুটি পেয়েছি। configসমস্যার সমাধান করে ব্যবহার করা।
মিখাইল_সাম

আমি স্নিগ্ধ আকারের সমস্যাটি ঠিক করতে স্পার্ক-সাবমিট কমান্ড ব্যবহার করে কনফিগারেশনগুলি যুক্ত করেছি। ধন্যবাদ।
প্রীতম সাধুখান

16

আপনার ড্রাইভারের স্মৃতিশক্তি বাড়ানো উচিত। আপনার $ স্পার্কহোম / কনফোল্ড ফোল্ডারে আপনার ফাইলটি সন্ধান করা spark-defaults.conf, সম্পাদনা করা উচিত এবং spark.driver.memory 4000mআপনার মাস্টারের মেমরির উপর নির্ভর করে সেট করা উচিত I এটিই আমার জন্য সমস্যাটি স্থির করে এবং সবকিছু সুচারুভাবে চালিত হয়


কত শতাংশ
মেমো

14

একটি জাভা হিপ আকার সেট করা আছে সেখানে স্ক্রিপ্টগুলি একবার দেখুন , দেখে মনে হচ্ছে আপনি স্পার্ক কর্মী চালানোর আগে এটি সেট করছেন না।

# Set SPARK_MEM if it isn't already set since we also use it for this process
SPARK_MEM=${SPARK_MEM:-512m}
export SPARK_MEM

# Set JAVA_OPTS to be able to load native libraries and to set heap size
JAVA_OPTS="$OUR_JAVA_OPTS"
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=$SPARK_LIBRARY_PATH"
JAVA_OPTS="$JAVA_OPTS -Xms$SPARK_MEM -Xmx$SPARK_MEM"

আপনি এখানে স্ক্রিপ্ট মোতায়েন করতে ডকুমেন্টেশন খুঁজে পেতে পারেন ।


আপনাকে ধন্যবাদ ~ আমি পরে চেষ্টা করব স্পার্ক ইউআই থেকে এটি প্রতিটি নির্বাহকের স্মৃতি 4096 দেখায় So তাই সেটিংটি সক্ষম হয়েছে, তাই না?
hequn8128

আমি অনুরূপ সমস্যার মুখোমুখি হয়ে আপনার উত্তর দেখেছি ( stackoverflow.com/questions/34762432/… )। আপনার প্রদত্ত লিঙ্কটি দেখে মনে হচ্ছে যে এক্সএমএস / এক্সএমএক্স সেট করা এখন আর নেই, আপনি বলতে পারেন কেন?
সেফি

লিপিটির সাথে লিঙ্ক করা সামগ্রীটি start up scriptsদুর্ভাগ্যক্রমে পরিবর্তিত হয়েছে। 2019-12-19 হিসাবে এই জাতীয় কোনও বিকল্প বিদ্যমান নেই
ডেভিড গ্রুমস

7

আমি এই সমস্যাটি থেকে অনেক ক্ষতিগ্রস্থ হয়েছি, আমরা গতিশীল সংস্থানসমূহের বরাদ্দ ব্যবহার করি এবং আমি ভেবেছিলাম এটি আমার ক্লাস্টার রিসোর্সগুলিকে অ্যাপ্লিকেশনটির জন্য উপযুক্ত করে তুলবে।

তবে সত্যটি হল, গতিশীল সংস্থান বরাদ্দকরণ ড্রাইভার মেমরি সেট করে না এবং এটি এটির ডিফল্ট মানতে রাখে যা 1 জি।

আমি স্পার্ক.ড্রাইভার.মেমরিটি এমন একটি সংখ্যার সাথে সেট করে সমাধান করেছি যা আমার ড্রাইভারের স্মৃতি অনুসারে (32gb র্যামের জন্য আমি এটি 18gb তে সেট করেছি)

আপনি এটি স্পার্ক সাবমিট কমান্ড ব্যবহার করে সেট করতে পারেন:

spark-submit --conf spark.driver.memory=18gb ....cont

খুব গুরুত্বপূর্ণ নোট, স্পার্ক ডকুমেন্টেশন অনুসারে আপনি যদি কোডটি সেট করে থাকেন তবে এই সম্পত্তিটি বিবেচনায় নেওয়া হবে না:

স্পার্কের বৈশিষ্ট্যগুলি প্রধানত দুটি ধরণের মধ্যে বিভক্ত করা যেতে পারে: একটি "স্পার্ক.ড্রাইভার.মেমরি", "স্পার্ক.এক্সেক্যুটারআইটিজমেন্টস" এর মতো স্থাপনার সাথে সম্পর্কিত, রানটাইমের সময় স্পারকনফের মাধ্যমে প্রোগ্রামগতভাবে সেট করার সময় এই ধরণের বৈশিষ্ট্যগুলি প্রভাবিত হতে পারে না, বা আচরণটি নির্ভর করে আপনি কোন ক্লাস্টার পরিচালক এবং স্থাপনা মোডটি বেছে নেবেন তার উপর নির্ভর করে তাই কনফিগারেশন ফাইলের মাধ্যমে সেট করার পরামর্শ দেওয়া হবে বা স্পার্ক-সাবমিট কমান্ড লাইন বিকল্পগুলি সরবরাহ করতে হবে; অন্যটি মূলত স্পার্ক রানটাইম নিয়ন্ত্রণের সাথে সম্পর্কিত, "স্পার্ক.টাস্ক.ম্যাক্সফেইলচারস" এর মতো, এই ধরণের বৈশিষ্ট্যগুলি যে কোনও উপায়ে সেট করা যায়।


2
আপনার ব্যবহার করা উচিত --conf spark.driver.memory = 18g
merenptah

5

বিস্তৃতভাবে বলতে গেলে স্পার্ক এক্সিকিউটার জেভিএম মেমরিকে দুটি ভাগে ভাগ করা যায়। স্পার্ক মেমরি এবং ব্যবহারকারীর স্মৃতি। এটি সম্পত্তি দ্বারা নিয়ন্ত্রিত হয় spark.memory.fraction- মান 0 এবং 1 এর মধ্যে হয় images যখন চিত্রের সাথে কাজ করা হয় বা স্পার্ক অ্যাপ্লিকেশনগুলিতে মেমরি নিবিড় প্রক্রিয়াজাতকরণ করা হয়, তখন এটি হ্রাস করার বিষয়টি বিবেচনা করুন spark.memory.fraction। এটি আপনার অ্যাপ্লিকেশন কাজের জন্য আরও মেমরি উপলব্ধ করবে। স্পার্ক ছড়িয়ে যেতে পারে, তাই এটি এখনও কম মেমরি ভাগ করে নিয়ে কাজ করবে।

সমস্যার দ্বিতীয় অংশটি হল কাজের বিভাজন। যদি সম্ভব হয় তবে আপনার ডেটাটিকে ছোট ছোট অংশে ভাগ করুন। ছোট ডেটার সম্ভবত কম স্মৃতি দরকার। তবে যদি এটি সম্ভব না হয় তবে আপনি স্মৃতিচারণের জন্য গণনা করছেন। সাধারণত একক নির্বাহক একাধিক কোর চালাবেন। এক্সিকিউটারদের মোট স্মৃতি সমস্ত সমবর্তী কাজের মেমরির প্রয়োজনীয়তাগুলি হ্যান্ডেল করার জন্য যথেষ্ট হতে হবে। যদি এক্সিকিউটারের মেমরি বাড়ানো কোনও বিকল্প না হয় তবে আপনি এক্সিকিউটারের জন্য কোরগুলি হ্রাস করতে পারেন যাতে প্রতিটি টাস্কের সাথে কাজ করার জন্য আরও মেমরি পাওয়া যায়। ১ টি মূল নির্বাহকের সাথে পরীক্ষা করুন যার সবচেয়ে বেশি সম্ভাব্য মেমরি আপনি দিতে পারেন এবং তারপরে আপনি সর্বোত্তম কোর গণনা না পাওয়া পর্যন্ত ক্রমবর্ধমান কোর রাখুন।


5

আপনি কি আপনার মাস্টার জিসি লগটি ফেলেছেন? সুতরাং আমি অনুরূপ সমস্যার মুখোমুখি হয়েছি এবং আমি স্পার্ক_ডিআরআইভিএমএমএমআরই কেবল এক্সএমএক্স হিপ সেট করেছি। প্রাথমিক স্তূপের আকার 1G অবধি থাকে এবং হিমের আকারটি কখনই এক্সএমএক্স হিপ পর্যন্ত স্কেল করে না।

"--Conf" spark.driver.extraJavaOptions = -Xms20g "পাস করা আমার সমস্যাটি সমাধান করে।

পিএস অক্স | গ্রেপ জাভা এবং আপনি অনুসরণ লগ দেখতে পাবেন: =

24501 30.7 1.7 41782944 2318184 পিটিএস / 0 এসএল + 18:49 0:33 / ইউএসআর / জাভা / সর্বশেষ / বিন / জাভা -সিপি / অপ্ট / স্পার্ক / সিএনএফ /: / অপ্ট / স্পার্ক / জারস / * -এক্সএমএক্স 30 জি-এক্সএম 2020


3

মেমরির হিপ আকার নির্ধারণের অবস্থান (কমপক্ষে স্পার্ক -১.০.০ এ) কনফ / স্পার্ক-এনভির মধ্যে। প্রাসঙ্গিক চলকগুলি হল SPARK_EXECUTOR_MEMORY& SPARK_DRIVER_MEMORY। আরও ডক্স রয়েছে ডিপ্লোয়মেন্ট গাইডে রয়েছে

এছাড়াও, সমস্ত স্লেভ নোডে কনফিগারেশন ফাইলটি অনুলিপি করতে ভুলবেন না।


4
আপনি কিভাবে জানেন যা এক মধ্যে সমন্বয় করতে না SPARK_EXECUTOR_MEMORY& SPARK_DRIVER_MEMORY?
হুনলে

13
অর্থাত্ ত্রুটিটি বাড়ানোর জন্য আপনাকে কী বলবে SPARK_EXECUTOR_MEMORYএবং কোন ত্রুটি বাড়িয়ে দিতে বলবে SPARK_DRIVER_MEMORY?
হুনলে

2

আমার উপরে উল্লিখিত ত্রুটির জন্য কয়েকটি সুগারেশন রয়েছে।

Exec নির্বাহক হিসাবে নির্ধারিত নির্বাহক মেমরির জন্য নির্ধারিত চেয়ে মেমরির জন্য প্রয়োজনীয় পার্টিশনগুলির সাথে ডিল করতে পারে।

Disk ডিস্ক I / O, ডেটা সিরিয়ালাইজেশন এবং নেটওয়ার্ক I / O জড়িত থাকায় শফলে ব্যয়বহুল ক্রিয়াকলাপ হ'ল আরও শ্যাফেলগুলি লাইভ কিনা তা দেখার চেষ্টা করুন ●

Broad ব্রডকাস্ট ব্যবহার করুন

Group গ্রুপবাইকি ব্যবহার করা থেকে বিরত থাকুন এবং রেডুসবাইয়ের সাথে প্রতিস্থাপনের চেষ্টা করুন

Wherever যেখানেই পরিবর্তন হয় সেখানে বিশাল জাভা অবজেক্টগুলি ব্যবহার করা এড়িয়ে চলুন


কারও জিজ্ঞাসা হাইজ্যাক করার জন্য দুঃখিত তবে গ্রুপবাইয়ের মাধ্যমে কীভাবে হ্রাস-বয়কে ব্যবহার করবেন?
সোমিল অসীজা

1

উপরের সরবরাহিত কোডটি সম্পর্কে আমার বোঝা থেকে, এটি ফাইলটি লোড করে এবং মানচিত্রের ক্রিয়াকলাপটি করে এবং এটি আবার সংরক্ষণ করে। এমন কোনও অপারেশন নেই যা পরিবর্তিত হতে পারে। এছাড়াও, এমন কোনও অপারেশন নেই যার জন্য ড্রাইভারের কাছে ডেটা আনার প্রয়োজন হয় তাই শ্যাফাল বা ড্রাইভার সম্পর্কিত যে কোনও কিছু সুর করতে কোনও প্রভাব ফেলতে পারে না। অনেকগুলি কাজ করার সময় ড্রাইভারের সমস্যা আছে তবে এটি কেবল 2.0.2 সংস্করণে স্পার্ক হওয়া পর্যন্ত ছিল। দুটি জিনিস ভুল হতে পারে।

  • কেবলমাত্র একজন বা কয়েকজন এক্সিকিউটিউটর রয়েছেন। নির্বাহকের সংখ্যা বৃদ্ধি করুন যাতে তাদের বিভিন্ন দাসে বরাদ্দ দেওয়া যায়। আপনি যদি সুতা ব্যবহার করছেন তবে নাম-এক্সিকিউটিউটর কনফিগারেশন পরিবর্তন করতে হবে বা আপনি যদি স্পার্ক স্ট্যান্ডেলোন ব্যবহার করছেন তবে নির্বাহকের জন্য নম্বরের সাথে টিউন করতে হবে এবং সর্বাধিক কোর কনফকে স্পার্ক করতে হবে। স্বতন্ত্র নাম নির্বাহকগুলিতে = প্রতিটি নির্বাহকের পক্ষে সর্বোচ্চ কোর / কোর।
  • পার্টিশনের সংখ্যা খুব কম বা সম্ভবত একটি মাত্র। সুতরাং এটি কম থাকলেও যদি আমাদের বহু-কোর থাকে তবে মাল্টি এক্সিকিউটাররা এটি তেমন সহায়ক হবে না কারণ সমান্তরাল পার্টিশনের সংখ্যার উপর নির্ভরশীল। সুতরাং ইমেজবান্ডেলআরডিডি.বিভাজন (11) করে পার্টিশনগুলি বাড়িয়ে দিন

0

এই সঠিক কনফিগারেশন সেট করা সমস্যা সমাধানে সহায়তা করে।

spark-submit --conf spark.yarn.maxAppAttempts=2 --executor-memory 10g --num-executors 50 --driver-memory 12g
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.