2015-04-17 14 views
10

Tôi gặp lỗi khi sử dụng mllib RandomForest để huấn luyện dữ liệu. Khi số liệu của tôi là rất lớn và phân vùng mặc định là tương đối nhỏ. vì vậy một ngoại lệ ném chỉ ra rằng "Kích thước vượt quá Integer.MAX_VALUE", stack trace orignal như sau,Tại sao phân vùng Spark RDD có giới hạn 2 GB cho HDFS?

15/04/16 14:13:03 WARN scheduler.TaskSetManager: Lost nhiệm vụ 19.0 trong giai đoạn 6.0 (TID 120, 10.215.149.47): java.lang.IllegalArgumentException: Kích thước vượt quá Integer.MAX_VALUE
tại sun.nio.ch.FileChannelImpl.map (FileChannelImpl.java:828) tại org.apache.spark.storage.DiskStore .getBytes (DiskStore.scala: 123) tại org.apache.spark.storage.DiskStore.getBytes (DiskStore.scala: 132) tại org.apache.spark.storage.BlockManager.doGetLocal (BlockManager.scala: 517) tại org.apache.spark.storage.BlockManager.getLocal (BlockManager.scala: 432) tại org.apache.spark.storage.BlockManager.get (BlockManager.scala: 618) tại org.apache.spark.CacheManager. putInBlockManager (CacheManager.scala: 146) tại org.apache.spark.CacheManager.getOrCompute (CacheManager.scala: 70)

các Integer.MAX_SIZE là 2GB, có vẻ như một số phân vùng ra khỏi bộ nhớ. Vì vậy, tôi repartiton phân vùng rdd của tôi đến 1000, để mỗi phân vùng có thể giữ dữ liệu ít hơn như trước. Cuối cùng, vấn đề được giải quyết !!!

Vì vậy, câu hỏi của tôi là: Tại sao kích thước phân vùng có giới hạn 2G? Dường như không có cấu hình thiết lập cho các giới hạn trong spark

+1

http://stackoverflow.com/questions/8076472/filechannel-map-integer-max-value-limit-error – experquisite

Trả lời

10

Các trừu tượng cơ bản cho các khối trong tia lửa là một ByteBuffer, mà tiếc là có một giới hạn của Integer.MAX_VALUE (~ 2GB).

Đây là critical issue ngăn không cho sử dụng tia lửa với bộ dữ liệu rất lớn. Tăng số lượng phân vùng có thể giải quyết nó (như trong trường hợp OP), nhưng không phải lúc nào cũng khả thi, ví dụ khi có chuỗi chuyển đổi lớn, một phần có thể tăng dữ liệu (flatMap vv) hoặc trong trường hợp dữ liệu bị lệch.

Giải pháp được đề xuất là đưa ra khái niệm trừu tượng như LargeByteBuffer có thể hỗ trợ danh sách các dấu gạch ngang cho một khối. Điều này tác động đến kiến ​​trúc tia lửa tổng thể, do đó nó vẫn chưa được giải quyết trong một thời gian dài.

+1

Xem thêm https://issues.apache.org/jira/browse/SPARK-5928 –

+1

có bất kỳ công việc tốt nào được biết đến cho vấn đề này không? Tăng số lượng phân vùng hoặc giảm? Chia các RDD thành các phần, chạy lệnh của bạn và sau đó kết hợp? Tắt Kryo? Sử dụng dataframes? Tôi đang gặp lỗi 2GB khi cố gắng phân vùng lại đơn giản bằng khóa RDD có kích thước khiêm tốn (84GB) và độ lệch thấp (AFAIK). Tôi có các yêu cầu bộ nhớ của tôi cho mỗi người thực hiện, mỗi nút chính, cho mỗi Java, v.v. tất cả đều quay lên khi chúng đi, và tôi hiện đang cố gắng phân vùng RDD này trên 6800 phân vùng. Đó có phải là quá nhiều, và thực sự gây ra vấn đề của tôi? –

+0

Xem https://issues.apache.org/jira/browse/SPARK-6235 mà vào tháng 9 năm 2016 có vẻ như là một sửa chữa. – pd40

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