繁体   English   中英

使用字段变量时触发“任务无法序列化”

[英]Spark “Task not serializable” when using field variables

我的测试代码非常简单,并且从spark示例中复制了很多代码,但是,

import org.apache.spark.sql.SparkSession

import scala.util.Properties

class MyTest(sparkSession: SparkSession, properties: java.util.Properties) {

  val spark: SparkSession = sparkSession

  val sparkHome = Properties.envOrElse("SPARK_HOME", "/spark")
  val props = properties

  def run(): Unit = {
    val logFile = sparkHome + "/README.md"
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains(props.get("v1"))).count()
    val numBs = logData.filter(line => line.contains(props.get("v2"))).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")

  }
}

但是,当我尝试运行它时,它总是Exception in thread "main" org.apache.spark.SparkException: Task not serializable报告Exception in thread "main" org.apache.spark.SparkException: Task not serializable并指向val numAs = logData.filter(line => line.contains(props.get("v1"))).count()

好吧,我将其更改为

val v1 = props.get("v1")
val v2 = props.get("v2")

val numAs = logData.filter(line => line.contains(v1)).count()
val numBs = logData.filter(line => line.contains(v2)).count()

例外不见了。 我认为原因是火花抱怨props无法序列化。 但是,java.util.Properties实际上实现了java.io.Serializable

class Properties extends Hashtable<Object,Object> {

和哈希表

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

为什么我仍然会收到此异常?

我需要执行此操作的原因是因为我的spark作业具有一些命令行参数,并且需要将它们传递到我的spark作业类实例中。 我有最佳做法吗?

这条线

line => line.contains(props.get("v1"))

隐式捕获this ,即MyTest ,因为它与以下内容相同:

line => line.contains(this.props.get("v1"))

并且MyTest不可序列化。

run()方法中而不是在类主体中定义val props = properties

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM