spark 任务task not serializable

项目场景:

在大数据项目中,经常会使用到spark。spark任务使用rdd的时候,特别要注意数据能否进行序列化


问题描述:

代码如下

val features = preFeatureDf
//            .withColumn("label",col("label").cast(IntegerType))

      .withColumn("allTraitData", struct(columnNameArray.map(col): _*))
      .drop(columnNameArray: _*)
      .withColumn("feature",
        udf[String,Row] { row => {

          val (featureTransformer, featureTransformerConfig) = FeatureConfigGenerate.getOrCreate(inputFeatureConf)
          val binding = new VariableBinding(64, featureTransformerConfig.getVarsize)
          val globalContext = new DefaultGlobalContext
          globalContext.setValueBinding(binding)

          val personaValues: PersonaValues = structRow2ColumnPersonaValues(row, columnNameArray.toArray)

          val arrayOps = featureTransformer.transform(personaValues, globalContext)

          arrayOps2PrettyVal(arrayOps)
        }

        }.apply(col("allTraitData"))
      )

修改了其他一行代码后,报错Task not Serializable

al (featureTransformer, featureTransformerConfig) = FeatureConfigGenerate.getOrCreate(inputFeatureConf.toString)

其中,inputFeatureConf是个jsonArray对象。


原因分析:

当前的scala版本,不支持jsonArray的序列化,导致报错。以后遇到这种无法序列化的问题,一般都是从driver端传递了给executor一个无法序列化的参数。通过排查哪些参数是从driver端传递过来的进行排查。


解决方案:

将inputFeatureConf.toString的操作放在driver端进行就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值