Java 如何在Workers上使用瞬态变量

Java 如何在Workers上使用瞬态变量,java,serialization,apache-spark,java-8,apache-spark-sql,Java,Serialization,Apache Spark,Java 8,Apache Spark Sql,我想知道如何在工人身上使用瞬态变量。 例如:-通过序列化MapFunction对象,从驱动程序向执行器发送映射任务命令。执行器反序列化命令,并在分区上执行它。 现在,如果在这个映射函数中我使用了一个临时变量,那么它如何在worker上可用,因为它没有序列化并发送给worker 同样在下面的链接示例中 例如: Class Test{ transient static SparkSession sparkSession; public static void main(String[] args

我想知道如何在工人身上使用瞬态变量。 例如:-通过序列化MapFunction对象,从驱动程序向执行器发送映射任务命令。执行器反序列化命令,并在分区上执行它。 现在,如果在这个映射函数中我使用了一个临时变量,那么它如何在worker上可用,因为它没有序列化并发送给worker

同样在下面的链接示例中

例如:

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是如何在workers上解析的,因为它是在驱动程序上创建的,并且在将闭包发送给workers时,sparkSession没有被发送,因为它没有序列化,所以它在workers上不应该为null,但它不是。为什么?


由于sparkSession是一个静态变量,因此它存储在类定义中,因此当该闭包发送给工作程序时,测试类定义是否也会与序列化闭包一起发送给工作程序?

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

请显示您使用的确切代码。代码中还需要什么?可以遵守的东西?例如,我认为sparkSession必须是静态的。我想知道的是工作人员如何使用瞬态变量。我刚刚通过查看网络编写了一个瞬态变量示例程序。请查看问题中的示例链接感谢您的回答,是的,lambda引用了sparkSession,但是工作人员如何使用相同的引用。因为sparkSession是一个静态变量,所以它存储在类定义中,所以当该闭包发送给worker时,测试类定义是否也发送给带有序列化闭包的worker?发送给worker的不是变量,而是变量引用的对象。因此,测试类不相关,变量sparkSession也不相关。相关的是使用lambda序列化的SparkSession类的实例。在内部,该实例由实现lambda.does控件的类的隐藏成员变量持有。该控件返回到驱动程序以执行瞬态变量行部分,然后再次返回到工作程序以执行其余部分。今天有人告诉我,但我不相信,所以我想确定它是否真的像那样工作。据我所知,Lambda的整个执行过程都发生在执行人身上。系统依赖于相同的代码,驱动程序JVM和执行程序JVM或线程可以使用相同的JAR,但在这种情况下,这是显而易见的。编辑:执行变量?不对,谢谢你的答复。我在中阅读了以下内容-驱动程序进程中的类副本不是执行器中的副本。它们不在同一个类加载器中,甚至不在同一个JVM中,甚至不在同一台机器上。因此,在驱动程序上设置静态变量不会对其他副本产生任何影响,因此远程设置时应为null。那么,遗嘱执行人如何获得sparkSession呢?