工人如何获得瞬态变量

时间:2016-08-29 15:34:02

标签: java serialization apache-spark java-8 apache-spark-sql

我想知道工人如何获得瞬态变量。 例如: - 通过序列化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?

1 个答案:

答案 0 :(得分:1)

我不确定lambdas是如何序列化的,但是你创建的lambda肯定会引用sparkSession的值。在lambda中使用的任何东西都成为它的一部分。