版权声明:本文为博主原创文章,转载联系 [email protected] https://blog.csdn.net/qq_31573519/article/details/84693786
原因:
在入库操作中,在 map\foreachePartition 等等分布式环境中new了连接对象(可以是redis、mysql等等),而此连接对象只能在本机起作用他们无法被序列化,所以在别的机器中找不到连接对象
类似下例代码,就会抛出该错:
val imClient = MistoreClientFactory.getMistoreClient(cateLog)
rsRdd
.map(w=>{
val imei = w._1
val itemIterator = w._2
})
解决:
- 在每个map算子里,new 一个新的连接对象
- repartition后,foreachPartition中new 出实例调用(推荐)
- 编写外部class,class extends Serializable,实现class的可序列化,这样即使有map这样的操作,也不怕连接对象无法序列化传输到其他机器上了
实例代码:
rsRdd
.repartition(100)
.foreachPartition(p=>{
val imClient = MistoreClientFactory.getMistoreClient(cateLog)
p.foreach(w=>{
val imei = w._1
val itemIterator = imClient.get
})
})