Apache spark spark在哪里存储持久化的状态?

Apache spark spark在哪里存储持久化的状态?,apache-spark,Apache Spark,我试图了解spark内的状态变化。然而,我最初认为我应该在下一个操作中使用返回值;这似乎是对同一实例的引用,而状态实际上在同一数据集中发生了变化 这是否意味着spark实际上正在改变数据集的状态?也就是说,这是否意味着数据集不是纯粹的功能性的,因为它持有可变状态?或者,这是否与会议有关?如果是的话,再一次;从功能上来说,这意味着数据集仍然包含可变状态,即使它是通过代理的 scala> var x = sc.parallelize(List(1, 2, 3)).toDS x: org.apa

我试图了解spark内的状态变化。然而,我最初认为我应该在下一个操作中使用返回值;这似乎是对同一实例的引用,而状态实际上在同一
数据集中发生了变化

这是否意味着spark实际上正在改变数据集的状态?也就是说,这是否意味着数据集不是纯粹的功能性的,因为它持有可变状态?或者,这是否与会议有关?如果是的话,再一次;从功能上来说,这意味着数据集仍然包含可变状态,即使它是通过代理的

scala> var x = sc.parallelize(List(1, 2, 3)).toDS
x: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> x.explain()
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]

scala> var y = x.persist();
y: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> y.explain();
== Physical Plan ==
*(1) InMemoryTableScan [value#25]
   +- InMemoryRelation [value#25], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
         +- *(1) SerializeFromObject [input[0, int, false] AS value#25]
            +- Scan ExternalRDDScan[obj#24]

scala> x.explain();
== Physical Plan ==
*(1) InMemoryTableScan [value#25]
   +- InMemoryRelation [value#25], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
         +- *(1) SerializeFromObject [input[0, int, false] AS value#25]
            +- Scan ExternalRDDScan[obj#24]

scala> y.unpersist();
res6: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> x.explain();
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]

scala> y.explain();
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]
这是否意味着spark实际上正在改变数据集的状态?也就是说,这是否意味着数据集不是纯粹的功能性的,因为它持有可变状态

没有

或者,这是否与会议有关

对。具体来说,它使用会话的
SharedState
及其
CacheManager

从功能上来说,这意味着数据集仍然包含可变状态,即使它是通过代理的

scala> var x = sc.parallelize(List(1, 2, 3)).toDS
x: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> x.explain()
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]

scala> var y = x.persist();
y: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> y.explain();
== Physical Plan ==
*(1) InMemoryTableScan [value#25]
   +- InMemoryRelation [value#25], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
         +- *(1) SerializeFromObject [input[0, int, false] AS value#25]
            +- Scan ExternalRDDScan[obj#24]

scala> x.explain();
== Physical Plan ==
*(1) InMemoryTableScan [value#25]
   +- InMemoryRelation [value#25], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
         +- *(1) SerializeFromObject [input[0, int, false] AS value#25]
            +- Scan ExternalRDDScan[obj#24]

scala> y.unpersist();
res6: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> x.explain();
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]

scala> y.explain();
== Physical Plan ==
*(1) SerializeFromObject [input[0, int, false] AS value#25]
+- Scan ExternalRDDScan[obj#24]

当然可以。Spark中的不变性是一个务实的决定,不是教条式的,这种行为更多的是一种规则而不是例外。

感谢您的支持。这是我的好奇心。由于api返回了另一个数据集,我刚刚假设该方法是纯功能性的。我很尴尬地错误地把这件事告诉了一位同事。