2015-03-06 14 views
49

Tôi đang chạy công việc Spark với chế độ đầu cơ. Tôi có khoảng 500 tác vụ và khoảng 500 tệp nén 1 GB gz. Tôi tiếp tục nhận được trong mỗi công việc, cho 1-2 nhiệm vụ, các lỗi đính kèm, nơi nó chạy lại sau hàng chục lần (ngăn chặn công việc để hoàn thành).Tại sao công việc Spark thất bại với org.apache.spark.shuffle.MetadataFetchFailedException: Thiếu vị trí đầu ra cho shuffle 0 trong chế độ đầu cơ?

org.apache.spark.shuffle.MetadataFetchFailedException: Thiếu một vị trí đầu ra cho ngẫu nhiên 0

Bất kỳ ý tưởng về ý nghĩa của vấn đề và làm thế nào để vượt qua nó là bao nhiêu?

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ỳ tin nhắn INFO nào của LostExecutor' chưa? Bạn có thể kiểm tra trang Executors của giao diện người dùng web và xem cách các nhà thực thi hành xử, đặc biệt không. GC-khôn ngoan? –

Trả lời

25

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

Giải pháp là thêm hoán đổ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 cho một số lần còn lại.

+1

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

+0

Vì vậy, tia lửa phàn nàn về việc không thể dự trữ bộ nhớ thực thi được yêu cầu và đề xuất của bạn là tăng thêm nữa? Nếu tăng hiệu suất, bạn có nghĩa là nó sẽ sụp đổ nhanh hơn, sau đó tôi hoàn toàn đồng ý. –

+9

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

11

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

Chúng tôi đã sử dụng JavaPairRDD.repartitionAndSortWithinPartitions trên dữ liệu 100GB và dữ liệu này không bị lỗi tương tự như ứng dụng của bạn. Sau đó, chúng tôi đã xem các bản ghi Sợi trên các nút cụ thể và phát hiện ra rằng chúng tôi có một số vấn đề ngoài bộ nhớ, do đó, Sợi bị 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 0 và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à không vô hạn) theo cách này.

+0

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

+0

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

+0

Thú vị, tôi cũng giảm spark.shuffle.memoryFraction về 0 nhưng có nhiều lỗi hơn trong một hàng. (Cụ thể: MetadataFetchFailedException và FetchFailedException intermittenly) Nó sẽ trở thành một lỗi/vấn đề nếu "tràn toàn bộ" có ít lỗi hơn "tràn một phần". – tribbloid

4

Tôi gặp vấn đề tương tự trên cụm YARN 3 máy của tôi. Tôi tiếp tục thay đổi RAM nhưng vấn đề vẫn tồn tại. Cuối cùng tôi thấy các thông điệp sau đây trong các bản ghi:

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 này, đã có tin nhắn 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 

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

0

Trong trường hợp của tôi (cụm độc lập), ngoại lệ được ném bởi 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 thư mục spark/work của các nô lệ đã giải quyết được vấn đề.

-1

Sự cố này là về bộ nhớ. Bạn đang chuyển bộ nhớ không có sẵn. Trong lệnh kích hoạt lệnh gửi, có thông số liên quan đến bộ nhớ và thực thi. Những thông số này là rất

--driver-memory 1200M 
--driver-cores 1 
--num-executors 1 

Give nhớ lái xe max n/2 (n = tổng bộ nhớ của nút.)

Cho tài xế-lõi n/1000 (n = nhớ lái xe (tính bằng MB))

Cho num-Chấp hành viên n (n = số nút bạn có)

Nếu bạn sẽ không cung cấp các thông số thích hợp trong lệnh spark submit sau đó sẽ có một phản hồi chậm hoặc nó sẽ gây ra một ngoại lệ.

Các vấn đề liên quan