Exception in thread “main“ org.apache.spark.SparkException: Task not serializable

Exception in thread “main” org.apache.spark.SparkException: Task not serializable

原因:

当需要在Driver之间传递变量时,这个变量是需要可以序列化的

错误代码

错误分析:
获取和关闭jedis连接应该在分区内进行,此处相当于在driver处获取了连接,所以需要序列化jedis变量.

解决方法:
把jedis连接获取放入分区内即可解决此问题.
代码

    val filteredStream: DStream[JSONObject] = jsonObjDStream.mapPartitions {
      //获取和关闭jedis连接应该在分区内进行,此处相当于在driver处获取了连接,所以需要序列化jedis变量
      val jedis: Jedis = RedisUtil.getJedisClient
      datas => {
        println("该分区过滤前数据量-----" + datas.size)
        val filterd: Iterator[JSONObject] = datas.filter(
          jsonObj => {
            val dt: String = jsonObj.getString("dt")
            val mid: String = jsonObj.getJSONObject("common").getString("mid")
            val dau: String = "dau:" + dt
            val isNew: lang.Long = jedis.sadd(dau, mid)
            if (isNew == 1L) true else false
          }
        )
        jedis.close()
        println("该分区过滤后数据量*******" + filterd.size)
        filterd
      }
    }

修正代码

val filteredStream: DStream[JSONObject] = jsonObjDStream.mapPartitions {
      datas => {
      	//只用修改此处即可------>
        val jedis: Jedis = RedisUtil.getJedisClient
        println("该分区过滤前数据量-----" + datas.size)
        val filterd: Iterator[JSONObject] = datas.filter(
          jsonObj => {
            val dt: String = jsonObj.getString("dt")
            val mid: String = jsonObj.getJSONObject("common").getString("mid")
            val dau: String = "dau:" + dt
            val isNew: lang.Long = jedis.sadd(dau, mid)
            if (isNew == 1L) true else false
          }
        )
        jedis.close()
        println("该分区过滤后数据量*******" + filterd.size)
        filterd
      }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值