Spark 作业中的 Scala 成员字段可见性

2023-11-29

我有一个 Scala 类,我定义如下:

import org.apache.spark.{SparkConf, SparkContext}

object TestObject extends App{
  val FAMILY = "data".toUpperCase

  override def main(args: Array[String]) {
    val sc = new SparkContext(new SparkConf())

    sc.parallelize(1 to 10)
      .map(getData)
      .saveAsTextFile("my_output")
  }

  def getData(i: Int) = {
    ( i, FAMILY, "data".toUpperCase )
  }
}

我将其提交到 YARN 集群,如下所示:

HADOOP_CONF_DIR=/etc/hadoop/conf spark-submit \
    --conf spark.hadoop.validateOutputSpecs=false \
    --conf spark.yarn.jar=hdfs:/apps/local/spark-assembly-1.2.1-hadoop2.4.0.jar \
    --deploy-mode=cluster \
    --master=yarn \
    --class=TestObject \
    target/scala-2.11/myjar-assembly-1.1.jar

出乎意料的是,输出如下所示,表明getData方法看不到的值FAMILY:

(1,null,DATA)
(2,null,DATA)
(3,null,DATA)
(4,null,DATA)
(5,null,DATA)
(6,null,DATA)
(7,null,DATA)
(8,null,DATA)
(9,null,DATA)
(10,null,DATA)

我需要了解什么,关于字段、范围、可见性、spark 提交、对象和单例等等,才能理解为什么会发生这种情况?如果我基本上想要定义为对可见的“常量”的变量,我应该做什么呢?getData method?


我可能会遗漏一些东西,但我认为你不应该定义main方法。当你延长App, 你继承了一个main,并且您不应该覆盖它,因为这实际上是调用您的代码中的代码App.

例如,您答案中的简单类应该写成

object TestObject extends App {
  val FAMILY = "data"
  println(FAMILY, "data")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark 作业中的 Scala 成员字段可见性 的相关文章

随机推荐