Connection pooling Spark Java:Java.util.ConcurrentModificationException,同时广播类型为GenericObjectPool的对象

Connection pooling Spark Java:Java.util.ConcurrentModificationException,同时广播类型为GenericObjectPool的对象,connection-pooling,apache-kafka,spark-streaming,kryo,Connection Pooling,Apache Kafka,Spark Streaming,Kryo,我正在java中从事spark流媒体项目。我正在尝试使用kafka producer java api从spark向apachekafka发送一些消息。因为为每个元素创建KafkaProducer实例的成本非常高,所以我尝试使用apache公共池框架使用producer池。如下面的代码片段所示,我正在创建GenericObjectPool实例并广播它,如下所示:- GenericObjectPool<KafkaProducer<String, String>> produ

我正在java中从事spark流媒体项目。我正在尝试使用kafka producer java api从spark向apachekafka发送一些消息。因为为每个元素创建KafkaProducer实例的成本非常高,所以我尝试使用apache公共池框架使用producer池。如下面的代码片段所示,我正在创建GenericObjectPool实例并广播它,如下所示:-

GenericObjectPool<KafkaProducer<String, String>> producerPool = new GenericObjectPool<KafkaProducer<String, String>>(
                new KafkaProducerFactory(prop));
final Broadcast<GenericObjectPool<KafkaProducer<String, String>>> pool = ssc.sparkContext() .broadcast(producerPool);  //**Causing exception**
GenericObjectPool producerPool=新建GenericObjectPool(
新卡夫卡生产厂(prop);
最终广播池=ssc.sparkContext().Broadcast(producerPool)//**引起异常**
KafkaProducerFactory类的代码粘贴在下面:-

import java.io.Serializable;
import java.util.Map;

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.kafka.clients.producer.KafkaProducer;

public class KafkaProducerFactory<K,V> extends BasePooledObjectFactory<KafkaProducer<K, V>> 
implements Serializable{
    private Map<String,Object> configs;
    public KafkaProducerFactory(Map<String, Object> configs) {
        this.configs=configs;
    }

    @Override
    public KafkaProducer<K, V> create() {
        return new KafkaProducer<K, V>(this.configs);
    }

    @Override
    public PooledObject<KafkaProducer<K,V>> wrap(KafkaProducer<K,V> producer) {
        return new DefaultPooledObject<KafkaProducer<K,V>>(producer);
    }

    @Override
    public void destroyObject(PooledObject<KafkaProducer<K,V>>obj){
        obj.getObject().close();
    }
}
Exception in thread "main" com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
Serialization trace:
classes (sun.misc.Launcher$AppClassLoader)
classloader (java.security.ProtectionDomain)
context (java.security.AccessControlContext)
acc (org.apache.spark.util.MutableURLClassLoader)
referent (java.lang.ref.WeakReference)
factoryClassLoader (org.apache.commons.pool2.impl.GenericObjectPool)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:318)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:549)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:570)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
    at org.apache.spark.serializer.KryoSerializationStream.writeObject(KryoSerializer.scala:148)
    at org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:203)
    at org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:102)
    at org.apache.spark.broadcast.TorrentBroadcast.<init>(TorrentBroadcast.scala:85)
    at org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:34)
    at org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:62)
    at org.apache.spark.SparkContext.broadcast(SparkContext.scala:1291)
    at org.apache.spark.api.java.JavaSparkContext.broadcast(JavaSparkContext.scala:648)
    at com.veda.txt.spark.Engine.start(Engine.java:63)
    at com.veda.txt.spark.Engine.main(Engine.java:126)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.util.ConcurrentModificationException
    at java.util.Vector$Itr.checkForComodification(Vector.java:1127)
    at java.util.Vector$Itr.next(Vector.java:1104)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:74)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:18)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    ... 39 more
15/08/26 20:38:14 INFO SparkContext: Invoking stop() from shutdown hook
import java.io.Serializable;
导入java.util.Map;
导入org.apache.commons.pool2.BasePooledObjectFactory;
导入org.apache.commons.pool2.PooledObject;
导入org.apache.commons.pool2.impl.DefaultPooledObject;
导入org.apache.kafka.clients.producer.KafkaProducer;
公共类KafkaProducerFactory扩展BasePooledObjectFactory
实现可序列化{
私有地图配置;
公共卡夫卡制作厂(地图配置){
this.configs=configs;
}
@凌驾
公共卡夫卡制作人创建(){
返回新的KafkaProducer(this.configs);
}
@凌驾
公共池对象包装(卡夫卡制作人){
返回新的DefaultPooledObject(生产者);
}
@凌驾
公共对象(PooledObjectobj){
obj.getObject().close();
}
}
但上面的行给了我以下粘贴的例外:-

com.esotericsoftware.kryo.KryoException:java.util.ConcurrentModificationException

完整堆栈跟踪粘贴在下面:-

import java.io.Serializable;
import java.util.Map;

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.kafka.clients.producer.KafkaProducer;

public class KafkaProducerFactory<K,V> extends BasePooledObjectFactory<KafkaProducer<K, V>> 
implements Serializable{
    private Map<String,Object> configs;
    public KafkaProducerFactory(Map<String, Object> configs) {
        this.configs=configs;
    }

    @Override
    public KafkaProducer<K, V> create() {
        return new KafkaProducer<K, V>(this.configs);
    }

    @Override
    public PooledObject<KafkaProducer<K,V>> wrap(KafkaProducer<K,V> producer) {
        return new DefaultPooledObject<KafkaProducer<K,V>>(producer);
    }

    @Override
    public void destroyObject(PooledObject<KafkaProducer<K,V>>obj){
        obj.getObject().close();
    }
}
Exception in thread "main" com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
Serialization trace:
classes (sun.misc.Launcher$AppClassLoader)
classloader (java.security.ProtectionDomain)
context (java.security.AccessControlContext)
acc (org.apache.spark.util.MutableURLClassLoader)
referent (java.lang.ref.WeakReference)
factoryClassLoader (org.apache.commons.pool2.impl.GenericObjectPool)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:318)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:549)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:570)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
    at org.apache.spark.serializer.KryoSerializationStream.writeObject(KryoSerializer.scala:148)
    at org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:203)
    at org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:102)
    at org.apache.spark.broadcast.TorrentBroadcast.<init>(TorrentBroadcast.scala:85)
    at org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:34)
    at org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:62)
    at org.apache.spark.SparkContext.broadcast(SparkContext.scala:1291)
    at org.apache.spark.api.java.JavaSparkContext.broadcast(JavaSparkContext.scala:648)
    at com.veda.txt.spark.Engine.start(Engine.java:63)
    at com.veda.txt.spark.Engine.main(Engine.java:126)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.util.ConcurrentModificationException
    at java.util.Vector$Itr.checkForComodification(Vector.java:1127)
    at java.util.Vector$Itr.next(Vector.java:1104)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:74)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:18)
    at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
    ... 39 more
15/08/26 20:38:14 INFO SparkContext: Invoking stop() from shutdown hook
线程“main”com.esotericsoftware.kryo.KryoException中的异常:java.util.ConcurrentModificationException 序列化跟踪: 类(sun.misc.Launcher$AppClassLoader) 类加载器(java.security.ProtectionDomain) 上下文(java.security.AccessControlContext) acc(org.apache.spark.util.MutableURLClassLoader) referent(java.lang.ref.WeakReference) factoryClassLoader(org.apache.commons.pool2.impl.GenericObjectPool) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 位于com.esotericsoftware.kryo.kryo.writeObject(kryo.java:501) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在com.esotericsoftware.kryo.kryo.writeClassAndObject(kryo.java:568)上 位于com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:318) 位于com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293) 位于com.esotericsoftware.kryo.kryo.writeObject(kryo.java:501) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 位于com.esotericsoftware.kryo.kryo.writeObjectOrNull(kryo.java:549) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:570) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 位于com.esotericsoftware.kryo.kryo.writeObject(kryo.java:501) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 位于com.esotericsoftware.kryo.kryo.writeObject(kryo.java:501) 位于com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 位于com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在com.esotericsoftware.kryo.kryo.writeClassAndObject(kryo.java:568)上 位于org.apache.spark.serializer.KryoSerializationStream.writeObject(KryoSerializer.scala:148) 位于org.apache.spark.broadcast.TorrentBroadcast$.blockifyObject(TorrentBroadcast.scala:203) 位于org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:102) 在org.apache.spark.broadcast.TorrentBroadcast.(TorrentBroadcast.scala:85) 位于org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:34) 在org.apache.spark.broadcast.broadcast上(BroadcastManager.scala:62) 位于org.apache.spark.SparkContext.broadcast(SparkContext.scala:1291) 在org.apache.spark.api.java.JavaSparkContext.broadcast(JavaSparkContext.scala:648) 位于com.veda.txt.spark.Engine.start(Engine.java:63) 位于com.veda.txt.spark.Engine.main(Engine.java:126) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:622) 位于org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665) 位于org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170) 位于org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193) 位于org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112) 位于org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 原因:java.util.ConcurrentModificationException 在java.util.Vector$Itr.checkForComodification(Vector.java:1127) 位于java.util.Vector$Itr.next(Vector.java:1104) 在com.esotericsoftware.kryo.serializers.Collecti