java - transient 变量如何在 Worker 上可用

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

我想知道临时变量如何在 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/

相关文章:

java - 在 log.d 中获取 json 响应,但不在应用程序内获取(包含代码)

c++ - boost 序列化 - 对不同命名空间中的单一数据类型提供加载和保存方法

c++ - 可序列化的 Boost 库 header 和仅 header 库

java - 如何在 Java Swing 应用程序中播放 MP4 视频

java - Hibernate HQL 不断抛出 'QuerySyntaxException: unexpected token'

python - 使用 Bottle 的自定义插件将日期时间作为 JSON 返回?

scala - 如何使用spark生成大量随机整数?

shell - 尝试在工作程序上启动执行程序时,Apache Spark shell 崩溃

python - 所选列中值的唯一组合的计数

java - Java 中的同步单例