2016-07-15 17 views
5

Tôi đang chạy mã này vào EMR 4.6.0 + Spark 1.6.1:Spark SQL thất bại vì "hồ bơi liên tục đã phát triển qua JVM hạn 0xFFFF"

val sqlContext = SQLContext.getOrCreate(sc) 
val inputRDD = sqlContext.read.json(input) 

try { 
    inputRDD.filter("`first_field` is not null OR `second_field` is not null").toJSON.coalesce(10).saveAsTextFile(output) 
    logger.info("DONE!") 
} catch { 
    case e : Throwable => logger.error("ERROR" + e.getMessage) 
} 

Trong giai đoạn cuối cùng của saveAsTextFile, nó không thành công với lỗi này:

16/07/15 08:27:45 ERROR codegen.GenerateUnsafeProjection: failed to compile: org.codehaus.janino.JaninoRuntimeException: Constant pool has grown past JVM limit of 0xFFFF 
/* 001 */ 
/* 002 */ public java.lang.Object generate(org.apache.spark.sql.catalyst.expressions.Expression[] exprs) { 
/* 003 */ return new SpecificUnsafeProjection(exprs); 
/* 004 */ } 
(...) 

Lý do có thể là gì? Cảm ơn

+1

Thú vị. Mỗi lớp java có một nhóm liên tục để giữ mọi thứ liên tục, bao gồm cả các tên phương thức. 'u2 constant_pool_count', vì vậy số hằng số tối đa là 0xFFFF. Tôi sử dụng json đơn giản để kiểm tra mà không ném một ngoại lệ. Tại sao mã này tạo ra quá nhiều hằng số? Nó sẽ là một phần có thể đăng của dữ liệu json? –

+0

@RockieYang không thể tải lên json của tôi nhưng nó bao gồm khoảng 90 trường Chuỗi/Số. –

+0

Bạn chỉ cần thêm một json. Và bạn đã kiểm tra xem nó có liên quan đến số hàng không? –

Trả lời

3

Giải quyết sự cố này bằng cách bỏ tất cả cột không được sử dụng trong Dataframe hoặc chỉ lọc cột bạn thực sự cần.

Tắt Spark Dataframe không thể xử lý các lược đồ siêu rộng. Không có số cột cụ thể mà Spark có thể phá vỡ với “Hằng số không đổi đã tăng qua giới hạn JVM 0xFFFF” - nó phụ thuộc vào loại truy vấn, nhưng việc giảm số lượng cột có thể giúp giải quyết vấn đề này.

Nguyên nhân gốc cơ bản nằm trong 64kb của JVM đối với các lớp Java được tạo - xem thêm câu trả lời của Andrew.

+1

Tôi chỉ làm một thử nghiệm, tia lửa hoạt động trên 100 cột nếu nó chỉ là cột đơn giản. Nếu đó là cột phức tạp với nhiều cấu trúc nhúng, khi tổng số trường vượt quá số lượng nhất định, nó cuối cùng sẽ thất bại. Có bao nhiêu lĩnh vực trong tổng số của bạn? –

+0

Khoảng 90 nói chung và một số lĩnh vực được lồng nhau vì vậy tổng thể tôi sẽ nói trên 100. –

+0

Nó phải là một cái gì đó đặc biệt trong cấu trúc json của bạn. Tôi đã thử nghiệm với 4000 cột đơn giản và nó hoạt động. Dù sao tốt của nó mà bạn giải quyết nó. –

3

Điều này là do giới hạn đã biết của Java đối với các lớp được tạo để vượt quá 64Kb.

Giới hạn này đã được thực hiện xung quanh trong SPARK-18016 được khắc phục trong Spark 2.3 - sẽ được phát hành vào tháng 1 năm 2018.

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