【发布时间】:2016-10-12 05:12:24
【问题描述】:
当从 Java 代码中使用从 Scala 代码生成的字节码时,我刚刚发现了 Scala 范围界定的一种非常奇怪的行为。考虑以下使用 Spark(Spark 1.4、Hadoop 2.6)的 sn-p:
import java.util.Arrays;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.broadcast.Broadcast;
public class Test {
public static void main(String[] args) {
JavaSparkContext sc =
new JavaSparkContext(new SparkConf()
.setMaster("local[*]")
.setAppName("test"));
Broadcast<List<Integer>> broadcast = sc.broadcast(Arrays.asList(1, 2, 3));
broadcast.destroy(true);
// fails with java.io.IOException: org.apache.spark.SparkException:
// Attempted to use Broadcast(0) after it was destroyed
sc.parallelize(Arrays.asList("task1", "task2"), 2)
.foreach(x -> System.out.println(broadcast.getValue()));
}
}
此代码失败,这是意料之中的,因为我在使用它之前自愿销毁了 Broadcast,但问题是在我的心智模型中它甚至不应该编译,更不用说运行良好了。
确实,Broadcast.destroy(Boolean) 被声明为private[spark],所以它不应该在我的代码中可见。我会尝试查看Broadcast 的字节码,但这不是我的专长,这就是我更喜欢发布这个问题的原因。另外,抱歉我懒得创建一个不依赖于 Spark 的示例,但至少你明白了。请注意,我可以使用 Spark 的各种包私有方法,而不仅仅是 Broadcast。
知道发生了什么吗?
【问题讨论】:
标签: java scala apache-spark bytecode package-private