我想知道工人如何获得瞬态变量。 例如: - 通过序列化MapFunction对象,从驱动程序向执行程序发送映射任务命令。执行程序反序列化命令,并在分区上执行它。 现在,如果在mapFunction中我使用了一个瞬态变量,它是如何在工人身上获得的,因为它没有被序列化并发送给工人。
同样在以下链接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是如何解决的,因为它是在驱动程序上创建的,并且在向工作人员发送封闭时发送的sparkSession没有被发送,因为它没有被序列化,所以不应该在工作者上为null但是它不是。为什么呢?
由于sparkSession是一个静态变量,所以它存储在类定义中,因此当该闭包被发送给worker时,Test类定义是否也被发送给具有序列化闭包的worker?
答案 0 :(得分:1)
我不确定lambdas是如何序列化的,但是你创建的lambda肯定会引用sparkSession的值。在lambda中使用的任何东西都成为它的一部分。