在Spark中,是否可以在两个执行程序之间共享数据?

时间:2016-10-22 09:57:37

标签: java scala apache-spark

我有一个非常大的只读数据,我希望同一节点上的所有执行程序都能使用。这可能在Spark中。我知道,你可以广播变量,但是你可以广播真正的大数组。在引擎盖下,它是否在同一节点上的执行程序之间共享数据?这如何能够在同一节点上运行的执行程序的JVM之间共享数据?

2 个答案:

答案 0 :(得分:5)

是的,在考虑您的数据是只读(不可变)时,您可以使用broadcast变量。广播变量必须满足以下属性。

  • 适合记忆
  • 不可变
  • 分发到群集

所以,这里唯一的条件是你的数据必须能够适应一个节点的内存。这意味着数据不应该是任何超大或超出内存限制的数据,如大表。

每个执行者都会收到广播变量的副本,并且该特定执行程序中的所有任务都在读取/使用该数据。这就像向集群中的所有工作节点发送大型只读数据一样。 即,只运送给每个工人一次而不是每个任务和执行者(它的任务)读取数据。

答案 1 :(得分:0)

我假设您问执行者如何共享可变状态。如果您只需要共享不可变数据,则可以参考@Stanislav的答案。
如果您需要执行程序之间的可变状态,则有很多方法:

  1. 共享的外部FS / DB
  2. 状态流式databricks doc
  3. 可变分布式共享缓存Ignite RDD