Spark & ​​Drools - Как сериализовать KieBase с помощью Kryo

Я использую Exception, пытаясь сериализовать объект KieBase в Spark.

Когда я выполняю следующий код:

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

Поднят ConcurrentModificationException

Исключение в потоке "main" com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException

Осмотревшись, я также обнаружил, что это известная проблема, но все еще нет решение.

Кто-нибудь знает, как сериализовать экземпляр KieBase с помощью Kryo?


person freedev    schedule 19.06.2017    source источник


Ответы (3)


Если вы выполняете задание Spark с помощью KryoSerializer, установив .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer"), или для него задано значение KryoSerializer по умолчанию, выполните следующие действия:

Создайте класс DroolsSerializerRegistration, расширив org.apache.spark.serializer.KryoRegistrator. Зарегистрируйте класс 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, а не все, которые были неудачными.

person Ganesh Shinde    schedule 05.07.2021

Я решил эту проблему, я также использую spark-submit, чтобы запустить мою банку maven. это мой конфиг:

.config("spark.serializer", "org.apache.spark.serializer.JavaSerializer")
person user8091235    schedule 07.05.2019

KieBase нельзя сериализовать. Вместо этого создайте одноэлементный класс и инициализируйте KieBase в исполнителе. У каждого исполнителя будет свой экземпляр.

person vgunnu    schedule 20.06.2017
comment
KieBase можно успешно сериализовать с помощью JavaSerializer. Например kryo.register(KieBase.class, new JavaSerializer()); вопрос в том, как это сделать только с Kryo. - person freedev; 20.06.2017