【发布时间】:2016-11-18 09:55:09
【问题描述】:
我在 EMR 4.6.0 + Spark 1.6.1 上运行此代码:
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)
}
在saveAsTextFile的最后阶段,它失败并出现以下错误:
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 */ }
(...)
可能是什么原因?谢谢
【问题讨论】:
-
有趣。每个 java 类都有一个常量池,用于保存所有常量,甚至包括类似的方法名称。
u2 constant_pool_count,所以常量的最大数量是 0xFFFF。我使用简单的 json 来测试哪个不会引发异常。为什么这段代码会生成这么多常量?是否可以发布部分json数据? -
@RockieYang 无法上传我的 json,但它包含大约 90 个字符串/数字字段。
-
你只需要添加一个json。你有没有测试过它是否相关的行数?
-
@RockieYang 我刚刚解决了这个问题,你可以查看下面的答案。关于您的问题,该作业运行了大约 400GB~ 数据。
标签: java scala apache-spark amazon-emr