Tại sao công việc Spark không thành công với org.apache.spark.shuffle.MetadataFetchFailedException: Thiếu vị trí đầu ra cho trộn 0 trong chế độ suy đoán?


85

Tôi đang thực hiện một công việc Spark ở chế độ đầu cơ. Tôi có khoảng 500 tác vụ và khoảng 500 tệp được nén 1 GB gz. Tôi tiếp tục thực hiện từng công việc, đối với 1-2 nhiệm vụ, lỗi kèm theo trong đó nó chạy lại hàng chục lần sau đó (ngăn công việc hoàn thành).

org.apache.spark.shuffle.MetadataFetchFailedException: Thiếu vị trí đầu ra cho trộn 0

Bất kỳ ý tưởng nào là ý nghĩa của vấn đề và làm thế nào để khắc phục nó?

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)

1
Bạn đã thấy bất kỳ LostExecutortin nhắn INFO chưa? Bạn có thể kiểm tra trang Người thực thi giao diện người dùng web và xem những người thực thi hoạt động như thế nào, đặc biệt. GC-khôn ngoan?
Jacek Laskowski

Câu trả lời:


50

Điều này đã xảy ra với tôi khi tôi cung cấp nhiều bộ nhớ cho nút công nhân hơn nó có. Vì nó không có hoán đổi, tia lửa bị rơi khi cố gắng lưu trữ các đối tượng để xáo trộn mà không còn bộ nhớ nào nữa.

Giải pháp là thêm trao đổi hoặc định cấu hình công nhân / người thực thi để sử dụng ít bộ nhớ hơn ngoài việc sử dụng mức lưu trữ MEMORY_AND_DISK trong một số lần tiếp tục.


3
Nếu bạn có tài nguyên trên nút (bộ nhớ), bạn có thể thử tăng bộ nhớ trình thực thi tia lửa. Tôi sẽ thử điều đó đầu tiên nếu bạn cũng lo lắng về hiệu suất.
nir

14
Xin chào @Joren, đây không phải là một cuộc thi. Vấn đề OP là trình thực thi không có đủ bộ nhớ để lưu trữ đầu ra xáo trộn. Điều hiệu quả đối với bạn không phải là giảm bộ nhớ của trình thực thi mà là sử dụng mức lưu trữ MEMORY_AND_DISK giúp loại bỏ giới hạn bộ nhớ của trình thực thi. Ngoài ra OP không nói về việc anh ta có bao nhiêu tài nguyên cho người thực thi.
nir

Tôi gặp vấn đề tương tự và tôi đã thử các phương pháp như tăng bộ nhớ của người thực thi, tăng số lượng phân phối lại, giải phóng thêm bộ nhớ vật lý. Và đôi khi nó hoạt động trong khi đôi khi không. Tôi thấy rằng điều này chỉ xảy ra trong giai đoạn đọc xáo trộn và tôi muốn hỏi rằng tôi có thể đặt StorageLevel ở đâu?
Lhfcws

Tôi đã tối ưu hóa cấu trúc dữ liệu của mình và sửa nó. Tôi chỉ thay đổi HashMap thành một byte [] được đăng bởi protostuff
Lhfcws

1
Cố gắng thay đổi spark.driver.overhead.memory và spark.executor.overhead.memory thành một giá trị lớn hơn 384 (Mặc định) và nó sẽ hoạt động. Bạn có thể sử dụng 1024 MB hoặc 2048 MB.
Gulati Rahul

14

Chúng tôi đã gặp lỗi tương tự với Spark, nhưng tôi không chắc nó liên quan đến sự cố của bạn.

Chúng tôi đã sử dụng JavaPairRDD.repartitionAndSortWithinPartitionstrên 100GB dữ liệu và nó liên tục bị lỗi tương tự như ứng dụng của bạn. Sau đó, chúng tôi xem xét nhật ký của Yarn trên các nút cụ thể và phát hiện ra rằng chúng tôi có một số loại vấn đề hết bộ nhớ, vì vậy Yarn đã làm gián đoạn quá trình thực thi. Giải pháp của chúng tôi là thay đổi / thêm spark.shuffle.memoryFraction 0vào .../spark/conf/spark-defaults.conf. Điều đó cho phép chúng tôi xử lý lượng dữ liệu lớn hơn nhiều (nhưng không may là vô hạn) theo cách này.


Nó thực sự là "0" hay đó là một lỗi đánh máy? Logic đằng sau đó là gì, để buộc nó tràn vĩnh viễn vào đĩa?
Virgil,

@Virgil Có. Chúng tôi đã thực hiện một số thử nghiệm. Chúng ta càng về gần 0 thì số tiền có thể xử lý càng lớn. Giá là 20% thời gian.
Notinlist

Thật thú vị, tôi cũng giảm spark.shuffle.memoryFraction xuống 0 nhưng gặp nhiều lỗi hơn liên tiếp. (Cụ thể là: MetadataFetchFailedException và FetchFailedException gián đoạn) Nó sẽ trở thành một lỗi / sự cố nếu "tràn toàn bộ" có ít lỗi hơn "tràn một phần".
tribbloid

11

Tôi gặp vấn đề tương tự trên cụm YARN 3 máy của mình. Tôi đã tiếp tục thay đổi RAM nhưng sự cố vẫn tiếp diễn. Cuối cùng tôi thấy các thông báo sau trong nhật ký:

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

và sau đó, có thông báo này:

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

Tôi đã sửa đổi các thuộc tính trong spark-defaults.conf như sau:

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

Đó là nó! Công việc của tôi đã hoàn thành thành công sau đó.


Trong các tài liệu tia lửa, người ta nói: spark.executor.heartbeatInterval should be significantly less than spark.network.timeout. Vì vậy, đặt cả hai giá trị đó thành cùng một giá trị có thể không phải là ý tưởng tốt nhất.
Bitswazsky

2

Đối với tôi, tôi đang thực hiện một số cửa sổ trên dữ liệu lớn (khoảng 50B hàng) và nhận được tải trọng

ExternalAppendOnlyUnsafeRowArray:54 - Đã đạt ngưỡng tràn 4096 hàng, chuyển sang org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter

Trong nhật ký của tôi. Rõ ràng 4096 có thể nhỏ trên kích thước dữ liệu như vậy ... điều này đã dẫn tôi đến JIRA sau:

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

Và cuối cùng là hai tùy chọn cấu hình sau:

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

Cả hai đều mặc định là 4096; Tôi đã nâng chúng lên cao hơn nhiều (2097152) và mọi thứ bây giờ dường như đang hoạt động tốt. Tôi không chắc chắn 100% điều này giống như vấn đề được nêu ở đây, nhưng đó là một điều khác để thử.


1

Tôi đã giải quyết lỗi này bằng cách tăng bộ nhớ được cấp phát trong executeMemory và driverMemory. Bạn có thể thực hiện việc này trong HUE chọn Chương trình Spark đang gây ra sự cố và trong thuộc tính -> Danh sách tùy chọn, bạn có thể thêm một cái gì đó như sau:

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

Tất nhiên giá trị của các tham số sẽ khác nhau tùy thuộc vào kích thước cụm của bạn và nhu cầu của bạn.


1

trong giao diện người dùng Spark Web, nếu có một số thông tin như Executors lost, thì bạn phải kiểm tra nhật ký sợi, đảm bảo liệu thùng chứa của bạn đã bị giết hay chưa.

Nếu container bị chết, nó có thể là do thiếu bộ nhớ.

Làm thế nào để tìm thông tin quan trọng trong nhật ký sợi? Ví dụ: có thể có một số cảnh báo như sau:

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

Trong trường hợp này, nó cho thấy bạn nên tăng spark.yarn.executor.memoryOverhead.


0

Trong trường hợp của tôi (cụm độc lập), ngoại lệ đã được ném ra vì hệ thống tệp của một số nô lệ Spark đã được lấp đầy 100%. Xóa mọi thứ trong các spark/workthư mục của nô lệ đã giải quyết được vấn đề.


0

Tôi gặp vấn đề tương tự, nhưng tôi đã tìm kiếm nhiều câu trả lời không thể giải quyết được vấn đề của tôi. cuối cùng, tôi gỡ lỗi mã của mình từng bước. Tôi thấy vấn đề gây ra bởi kích thước dữ liệu không cân bằng cho mỗi phân vùng, dẫn đến MetadataFetchFailedExceptionđiều đó trong mapgiai đoạn không phải reducegiai đoạn. chỉ làm df_rdd.repartition(nums)trướcreduceByKey()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.