【问题标题】:Spark & Drools - How to serialize KieBase with KryoSpark & Drools - 如何用 Kryo 序列化 KieBase
【发布时间】:2017-06-19 16:47:52
【问题描述】:

我正在尝试在 Spark 中序列化 KieBase 对象的异常中运行。

当我执行以下代码时:

val kieBase = kieContainer.getKieBase
val broadcastKieBase = spark.sparkContext.broadcast(kieBase)

提出了ConcurrentModificationException

线程“主”com.esotericsoftware.kryo.KryoException 中的异常: java.util.ConcurrentModificationException

环顾四周,我也找到了this is a known problem,但仍然没有解决方案。

有人知道如何用 Kryo 序列化 KieBase 实例吗?

【问题讨论】:

    标签: java scala apache-spark drools kryo


    【解决方案1】:

    如果您通过设置.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 使用 KryoSerializer 执行 Spark 作业,或者默认设置为 KryoSerializer,请按照以下步骤操作:

    通过扩展org.apache.spark.serializer.KryoRegistrator 创建 DroolsSerializerRegistration 类。为com.esotericsoftware.kryo.serializers.JavaSerializer注册类org.drools.core.impl.KnowledgeBaseImpl如下图:

    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 库关联的类,而不是所有失败的类。

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题,我也使用 spark-submit 运行我的 maven jar。 这是我的配置:

      .config("spark.serializer", "org.apache.spark.serializer.JavaSerializer")
      

      【讨论】:

        【解决方案3】:

        KieBase 不能序列化。而是创建一个单例类并在执行程序中初始化 KieBase。每个执行者都有自己的实例。

        【讨论】:

        • 使用JavaSerializer可以成功序列化KieBase。例如kryo.register(KieBase.class, new JavaSerializer()); 问题是如何仅使用 Kryo 来实现。
        猜你喜欢
        • 2016-07-02
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多