火花& Drools - 如何使用Kryo序列化KieBase

时间:2017-06-19 16:47:52

标签: java scala apache-spark drools kryo

我正在尝试在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实例?

3 个答案:

答案 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。每个执行者都有自己的实例。