Org.apache.spark.shuffle.MetadataFetchFiledException দ্বারা স্পার্ক চাকরীগুলি কেন ব্যর্থ হয়: জল্পনা মোডে 0 টি বদলের জন্য একটি আউটপুট অবস্থান অনুপস্থিত?


88

আমি একটি জল্পনা মোডে স্পার্ক কাজ চালাচ্ছি। আমার প্রায় 500 টি টাস্ক এবং 1 জিবি জিজেডের প্রায় 500 ফাইল সংকুচিত রয়েছে। আমি প্রতিটি কাজ পেতে থাকি, 1-2 টি কাজের জন্য, সংযুক্ত ত্রুটি যেখানে এটি পরে কয়েক ডজন বার পুনরায় সংঘটিত হয় (কাজটি শেষ করতে বাধা দেয়)।

org.apache.spark.shuffle.MetadataFetchFiledException: শ্যাফেল 0 এর জন্য একটি আউটপুট অবস্থান অনুপস্থিত

কোনও ধারণা সমস্যার অর্থ কী এবং কীভাবে এটি পরাভূত করতে পারেন?

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0
    at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:384)
    at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:381)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
    at org.apache.spark.MapOutputTracker$.org$apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:380)
    at org.apache.spark.MapOutputTracker.getServerStatuses(MapOutputTracker.scala:176)
    at org.apache.spark.shuffle.hash.BlockStoreShuffleFetcher$.fetch(BlockStoreShuffleFetcher.scala:42)
    at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:40)
    at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:92)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
    at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
    at org.apache.spark.rdd.FlatMappedRDD.compute(FlatMappedRDD.scala:33)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
    at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
    at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
    at org.apache.spark.scheduler.Task.run(Task.scala:56)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:196)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

4
আপনি কি কোনও LostExecutorINFO বার্তা দেখেছেন ? আপনি কি ওয়েব ইউআই এর এক্সিকিউটার্স পৃষ্ঠাটি পরীক্ষা করতে পারেন এবং এক্সিকিউটররা কীভাবে আচরণ করে তা দেখতে পারেন, এসএসপি। জিসি বুদ্ধিমান?
জ্যাসেক লাসকোভস্কি

উত্তর:


52

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

সমাধানটি হ'ল অদলবদল যুক্ত করা, বা কর্মী / নির্বাহককে কম মেমোরি ব্যবহার করার সাথে সাথে MEMORY_AND_DISK স্টোরেজ স্তরটি ব্যবহার করার পরেও বেশ কয়েকটি ক্রমাগত ব্যবহার করতে হবে।


4
নোডে (মেমরি) আপনার যদি কোনও সংস্থান থাকে তবে আপনি স্পার্ক এক্সিকিউটারের স্মৃতি বাড়িয়ে দিতে চেষ্টা করতে পারেন। আপনি যদি পারফরম্যান্স নিয়েও উদ্বিগ্ন হন তবে আমি প্রথমে চেষ্টা করব।
nir

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

আমার একই সমস্যা রয়েছে এবং আমি এক্সিকিউটারের মেমরি বৃদ্ধি, বিভাগগুলির পরিমাণ বাড়ানো, আরও শারীরিক স্মৃতি মুক্ত করার মতো পদ্ধতিগুলি চেষ্টা করেছি। এবং কখনও কখনও এটি কাজ করে কখনও কখনও না। আমি দেখতে পেয়েছি যে এটি কেবল শিফলে পঠন পর্বেই ঘটেছিল এবং আমি জিজ্ঞাসা করতে চাই যে আমি স্টোরেজলিভেলটি কোথায় সেট করতে পারি?
Lhfcws

আমি আমার ডেটা কাঠামোটি অনুকূলিত করে এটিকে ঠিক করেছি fixed আমি সবেমাত্র হাশম্যাপকে একটি বাইটে পরিবর্তন করেছি [] যা প্রোটোস্টফ দ্বারা সিরিয়ালীকৃত হয়েছিল
Lhfcws

4
স্পার্ক.ড্রাইভার.ওভারহেড.মোরি এবং স্পার্ক.এক্সেকিউটার.ওভারহেড.মেমরিটি আরও বেশি মূল্যবান হিসাবে 384 (ডিফল্ট) পরিবর্তন করার চেষ্টা করুন এবং এটি কাজ করা উচিত। আপনি 1024 এমবি বা 2048 এমবি ব্যবহার করতে পারেন।
রাহুল গুলতি

15

স্পার্কের সাথে আমাদের একই রকম ত্রুটি ছিল, তবে আমি নিশ্চিত নই যে এটি আপনার সমস্যার সাথে সম্পর্কিত।

আমরা JavaPairRDD.repartitionAndSortWithinPartitions১০০ জিবি ডেটা ব্যবহার করেছি এবং এটি আপনার অ্যাপ্লিকেশনটিতে একইভাবে ব্যর্থ হতে থাকে। তারপরে আমরা নির্দিষ্ট নোডগুলিতে সুতোর লগগুলি লক্ষ্য করে দেখতে পেলাম যে আমাদের এক ধরণের স্মৃতি বহির্ভূত সমস্যা রয়েছে, সুতরাং সুতাটি কার্যকর করতে বাধা দেয়। আমাদের সমাধানটি পরিবর্তন / যুক্ত করা spark.shuffle.memoryFraction 0ছিল .../spark/conf/spark-defaults.conf। এটি আমাদের এভাবে আরও বড় আকারের (তবে দুর্ভাগ্যক্রমে অসীম নয়) ডেটা হ্যান্ডেল করতে দেয়।


এটি কি সত্যিই "0" বা টাইপিংয়ের ত্রুটি ছিল? স্থায়ীভাবে ডিস্কে ছড়িয়ে দিতে বাধ্য করার পিছনে যুক্তিটি কী?
ভার্জিল

@ ভার্জিল হ্যাঁ আমরা কিছু পরীক্ষা করেছি। প্রসেসেবল পরিমাণ যত বেশি পেয়েছিল আমরা শূন্যের কাছাকাছি ছিলাম। মূল্য সময় 20% ছিল।
নোটলিস্ট 21 '12

আকর্ষণীয়, আমি স্পার্ক.শ্যাফেল.মোমরিফ্রেশনও শূন্যে হ্রাস করেছি তবে পরপর আরও ত্রুটি পেয়েছি। (যথা: মেটাডেটা ফেচফেইলএক্সেপশন এবং ফেচফেইলএক্সেপশন আন্তঃসত্তা) "আংশিক-স্পিল" এর চেয়ে "অল-স্পিল" এর কম ত্রুটি থাকলে এটি একটি বাগ / ইস্যুতে পরিণত হওয়া উচিত।
Tribbloid

11

আমি আমার 3 মেশিন ইয়ার্ন ক্লাস্টারে একই সমস্যা পেয়েছি। আমি র‌্যাম পরিবর্তন করতে থাকি কিন্তু সমস্যাটি অব্যাহত থাকে। অবশেষে আমি লগগুলিতে নিম্নলিখিত বার্তাগুলি দেখেছি:

17/02/20 13:11:02 WARN spark.HeartbeatReceiver: Removing executor 2 with no recent heartbeats: 1006275 ms exceeds timeout 1000000 ms
17/02/20 13:11:02 ERROR cluster.YarnScheduler: Lost executor 2 on 1worker.com: Executor heartbeat timed out after 1006275 ms

এবং এর পরে, এই বার্তাটি ছিল:

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 67

আমি স্পার্ক-ডিফল্টকন্টে বৈশিষ্ট্যগুলি নীচে পরিবর্তন করেছি:

spark.yarn.scheduler.heartbeat.interval-ms 7200000
spark.executor.heartbeatInterval 7200000
spark.network.timeout 7200000

এটাই! এর পরে আমার কাজটি সফলতার সাথে শেষ হয়েছে।


4
স্ফুলিঙ্গ ডক্স, এটা বলা হয় যে, spark.executor.heartbeatInterval should be significantly less than spark.network.timeout। সুতরাং, উভয়কে একই মূল্যে সেট করা সেরা ধারণা নাও হতে পারে।
বিটসওয়াজস্কি

2

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

--driver-memory 10G --executor-memory 10G --num-executors 50 --executor-cores 2

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


2

আমার জন্য, আমি বড় ডেটাতে প্রায় উইন্ডোজিং করছিলাম (প্রায় 50 বি সারি) এবং একটি নৌকা বোঝা পাচ্ছিলাম

ExternalAppendOnlyUnsafeRowArray:54 - এতে স্যুইচিং করে 4096 সারির স্পিল প্রান্তে পৌঁছেছে org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter

আমার লগে স্পষ্টতই 4096 এই জাতীয় ডেটা আকারে ছোট হতে পারে ... এটি আমাকে নিম্নলিখিত জিরার দিকে নিয়ে যায়:

https://issues.apache.org/jira/browse/SPARK-21595

এবং শেষ পর্যন্ত নিম্নলিখিত দুটি কনফিগারেশন বিকল্পের জন্য:

  • spark.sql.windowExec.buffer.spill.threshold
  • spark.sql.windowExec.buffer.in.memory.threshold

উভয়ই 4096 এ ডিফল্ট; আমি এগুলিকে অনেক বেশি বাড়িয়েছি (2097152) এবং এখন জিনিসগুলি বেশ ভালভাবে দেখায়। আমি এখানে উত্থাপিত সমস্যার মতোই 100% নিশ্চিত নই তবে এটি চেষ্টা করার অন্য জিনিস।


1

স্পার্ক ওয়েব ইউআইতে, যদি এর মতো কিছু তথ্য থাকে Executors lostতবে আপনাকে সুতোর লগটি পরীক্ষা করতে হবে, নিশ্চিত করুন যে আপনার ধারকটি মারা গেছে কিনা।

যদি ধারকটি মারা যায় তবে এটি সম্ভবত স্মৃতিশক্তি না থাকার কারণে।

সুতা লগগুলিতে কী তথ্যটি সন্ধান করবেন? উদাহরণস্বরূপ, এর মতো কিছু সতর্কতা থাকতে পারে:

Container killed by YARN for exceeding memory limits. 2.5 GB of 2.5 GB physical memory used. 
Consider boosting spark.yarn.executor.memoryOverhead.

এই ক্ষেত্রে, এটি আপনাকে বৃদ্ধি করা উচিত পরামর্শ দেয় spark.yarn.executor.memoryOverhead


0

আমার ক্ষেত্রে (স্বতন্ত্র ক্লাস্টার) ব্যতিক্রমটি ছুঁড়ে দেওয়া হয়েছিল কারণ কিছু স্পার্ক ক্রীতদাসের ফাইল সিস্টেম 100% ভরাট ছিল। spark/workদাসদের ফোল্ডারে সমস্ত কিছু মুছে ফেলা বিষয়টি সমাধান করে।


0

আমি একই সমস্যা পেয়েছি, কিন্তু আমি অনেক উত্তর অনুসন্ধান করেছি যা আমার সমস্যার সমাধান করতে পারে না। শেষ পর্যন্ত, আমি ধাপে ধাপে আমার কোডটি ডিবাগ করি। আমি দেখতে পাই যে ডেটা আকারের কারণে সৃষ্ট সমস্যাটি প্রতিটি পার্টিশনের জন্য ভারসাম্যপূর্ণ নয়, MetadataFetchFailedExceptionযা mapপর্যায়ে নয় এমন reduceপর্যায়ে পৌঁছেছে । ঠিক df_rdd.repartition(nums)আগে করাreduceByKey()

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