我想知道临时变量如何在 worker 身上可用。 例如:- 映射任务命令通过序列化 MapFunction 对象从驱动程序发送到执行程序。执行器反序列化命令,并在分区上执行它。 现在,如果我在那个 mapFunction 中使用一个 transient 变量,它如何在工作人员中可用,因为它没有序列化并发送给工作人员。
同样在以下链接的示例中 https://www.mapr.com/blog/how-log-apache-spark
例子:
Class Test{
transient static SparkSession sparkSession;
public static void main(String[] args){
sparkSession = //Initialize SparkSession
Dataset<Row> dataset = sparkSession.read().csv("A.csv");
dataset.createOrReplaceTempView("TEMP_TABLE");
Dataset<Row> dataset2 = sparkSession.sql("SELECT * FROM TEMP_TABLE");
Dataset<String> stringDataset = dataset2.map((MapFuction<Row,String>) (row)->{
Dataset<Row> tempDataset = sparkSession.sql("SELECT NAME FROM TEMP_TABLE WHERE ID='" + row.getString(0) + "'");
String temp = tempDataset.first().getString(0);
return temp;
},Encoders.STRING());
stringDataset.show();
}
}
在上面的示例中,sparkSession 是如何在 worker 上解析的,因为它是在驱动程序上创建的,而在将闭包发送给 worker 时,sparkSession 没有发送,因为它没有序列化,所以它不应该在 worker 上为空,但事实并非如此。为什么?
由于 sparkSession 是一个静态变量,因此它存储在类定义中,因此当将该闭包发送给工作人员时,测试类定义是否也通过序列化闭包发送给工作人员?
最佳答案
我不确定 lambda 是如何序列化的,但是您创建的 lambda 肯定具有对 sparkSession 值的引用。在 lambda 中使用的任何东西都会成为它的一部分。
关于java - transient 变量如何在 Worker 上可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210014/