【发布时间】:2015-05-21 21:25: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)
关于字段、范围、可见性、火花提交、对象和单例等等,我需要了解什么,才能理解为什么会发生这种情况?如果我基本上希望将变量定义为getData 方法可见的“常量”,我应该怎么做?
【问题讨论】:
-
这是一个序列化问题,看起来您正在使用 Kryo 作为序列化。您是否提供正确的课程注册?您是否尝试过删除
spark.serializer=org.apache.spark.serializer.KryoSerializer行? -
如果我不在我的 RDD 中使用自定义类型,是否需要任何 Kryo 注册?
-
我已经从作业提交中删除了 Kryo 行,但仍然出现同样的问题。
-
我编辑了代码以使其更简单,删除了所有 HBase 内容,因为这不是问题的一部分。
标签: scala initialization apache-spark visibility