我正在尝试在Spark中序列化KieBase
对象的异常中运行。
当我执行以下代码时:
val kieBase = kieContainer.getKieBase
val broadcastKieBase = spark.sparkContext.broadcast(kieBase)
引发ConcurrentModificationException
线程中的异常" main" com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
环顾四周,我发现this is a known problem,但仍无法解决。
任何人都知道如何使用Kryo序列化KieBase
实例?
答案 0 :(得分:2)
如果您通过设置 .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
使用 KryoSerializer 执行 Spark 作业或将其设置为 KryoSerializer 作为默认值,请按照以下步骤操作:
通过扩展 org.apache.spark.serializer.KryoRegistrator
创建 DroolsSerializerRegistration 类。为 org.drools.core.impl.KnowledgeBaseImpl
注册类 com.esotericsoftware.kryo.serializers.JavaSerializer
,如下所示:
package com.spark.kryo.serializers
import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.serializers.JavaSerializer
import org.apache.spark.serializer.KryoRegistrator
class DroolsSerializerRegistration extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classOf[org.drools.core.impl.KnowledgeBaseImpl], new JavaSerializer)
}
}
然后在 SparkConf 中设置以下配置
.config("spark.kryo.registrator", "com.spark.kryo.serializers.DroolsSerializerRegistration")
如果您不确定这是否由于 org.drools.core.impl.KnowledgeBaseImpl
而中断,请在 SparkConf 中设置以下配置以获取导致问题的确切类。
.config("spark.kryo.registrationRequired", "true")
在某些情况下,它可能会提供多个类,然后使用 com.esotericsoftware.kryo.serializers.JavaSerializer
注册所有类。
一旦找出与 Drools 关联的所有类,然后删除 spark.kryo.registrationRequired
并仅注册与 Drools 库关联的那些类,而不是所有失败的类。
答案 1 :(得分:1)
我已经解决了这个问题,我也使用spark-submit运行我的maven jar。 这是我的配置:
%ref(1)
答案 2 :(得分:0)
KieBase无法序列化。而是创建一个单例类,并在执行程序中使用KieBase。每个执行者都有自己的实例。