问题代码如下;
connection连接对象会被序列化,并会从driver端发送到worker端。
可能会出现两种错误:
1、序列化错误:conncetion对象不是序列化的对象,会出现序列化的错误。
2、初始化错误:connection对象在worker端会被初始化。
解决办法:在worker端,创建connection对象。
第一种方案(严重不好):
问题:会在每条record中,创建一个新的connection对象。
第二种方案(较好):
在rdd中的每个partition中创建一个connection对象,并在当前partition中的所有记录中使用当前的connection对象。
第三种方案(相当好):
在多个批次的rdd中重用connection对象。创建一个connection的连接池
注意:连接池中的connection是在需要的时候创建,一段时间不使用后超时。
dstream.foreachRDD { rdd =>
val connection = createNewConnection() // executed at the driver
rdd.foreach { record =>
connection.send(record) // executed at the worker
}
}
connection连接对象会被序列化,并会从driver端发送到worker端。
可能会出现两种错误:
1、序列化错误:conncetion对象不是序列化的对象,会出现序列化的错误。
2、初始化错误:connection对象在worker端会被初始化。
解决办法:在worker端,创建connection对象。
第一种方案(严重不好):
dstream.foreachRDD { rdd =>
rdd.foreach { record =>
val connection = createNewConnection()
connection.send(record)
connection.close()
}
}
问题:会在每条record中,创建一个新的connection对象。
第二种方案(较好):
dstream.foreachRDD { rdd =>
rdd.foreachPartition { partitionOfRecords =>
val connection = createNewConnection()
partitionOfRecords.foreach(record => connection.send(record))
connection.close()
}
}
在rdd中的每个partition中创建一个connection对象,并在当前partition中的所有记录中使用当前的connection对象。
第三种方案(相当好):
dstream.foreachRDD { rdd =>
rdd.foreachPartition { partitionOfRecords =>
val connection = ConnectionPool.getConnection() // ConnectionPool is a static, lazily initialized pool of connections
partitionOfRecords.foreach(record => connection.send(record))
ConnectionPool.returnConnection(connection) // return to the pool for future reuse
}
}
在多个批次的rdd中重用connection对象。创建一个connection的连接池
注意:连接池中的connection是在需要的时候创建,一段时间不使用后超时。