Spark SQL 失败,因为 "Constant pool has grown past JVM limit of 0xFFFF"
Spark SQL fails because "Constant pool has grown past JVM limit of 0xFFFF"
我是 运行 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 */ }
(...)
可能是什么原因?谢谢
通过删除 Dataframe 中所有未使用的列或仅过滤您实际需要的列来解决此问题。
原来 Spark Dataframe 无法处理超宽模式。没有特定的列数,Spark 可能会因“常量池已超过 0xFFFF 的 JVM 限制”而中断 - 这取决于查询的种类,但减少列数可以帮助解决此问题。
根本原因在于 JVM 的 64kb 生成 Java 类 - 另请参阅安德鲁的回答。
这是由于 Java 的已知限制,生成的 类 超过 64Kb。
此限制已在 SPARK-18016 中解决,已在 Spark 2.3 中修复 - 将在 Jan/2018 中发布。
为了将来参考,此问题已在 spark 2.3
中修复(正如 Andrew 所指出的)。
如果您在 Amazon EMR 上遇到此问题,请升级到发布版本 5.13
或更高版本。
我是 运行 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 */ }
(...)
可能是什么原因?谢谢
通过删除 Dataframe 中所有未使用的列或仅过滤您实际需要的列来解决此问题。
原来 Spark Dataframe 无法处理超宽模式。没有特定的列数,Spark 可能会因“常量池已超过 0xFFFF 的 JVM 限制”而中断 - 这取决于查询的种类,但减少列数可以帮助解决此问题。
根本原因在于 JVM 的 64kb 生成 Java 类 - 另请参阅安德鲁的回答。
这是由于 Java 的已知限制,生成的 类 超过 64Kb。
此限制已在 SPARK-18016 中解决,已在 Spark 2.3 中修复 - 将在 Jan/2018 中发布。
为了将来参考,此问题已在 spark 2.3
中修复(正如 Andrew 所指出的)。
如果您在 Amazon EMR 上遇到此问题,请升级到发布版本 5.13
或更高版本。