火花存储状态在哪里持续存在?

时间:2018-11-08 10:16:57

标签: apache-spark

我试图了解Dataset#persist在spark中发生了什么变化。我本来以为我应该将返回值用于下一个动作。看来,这是对同一实例的引用,并且状态实际上是在同一Dataset中突变的。

这是否意味着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]

1 个答案:

答案 0 :(得分:1)

  

这是否意味着spark实际上正在使数据集的状态发生变异?就是说,这是否意味着数据集不具有纯粹的功能,因为它具有可变状态?

  

或者,这与会话有关吗?

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

  

从功能上讲,这意味着即使通过代理,数据集仍包含可变状态。

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