Spark异常:task cannont be Serializable

版权声明:本文为博主原创文章,转载联系 [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
      })

解决:

  1. 在每个map算子里,new 一个新的连接对象
  2. repartition后,foreachPartition中new 出实例调用(推荐)
  3. 编写外部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
		})
	})

猜你喜欢

转载自blog.csdn.net/qq_31573519/article/details/84693786