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

2022-09-03 15:35:23

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


答案 1

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

  • 适合内存
  • 分发到群集

因此,这里唯一的条件是您的数据必须能够容纳在一个节点上的内存中。这意味着数据不应该是任何超级大或超出内存限制的东西,就像一个巨大的表。

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


答案 2

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

  1. 共享外部 FS/DB
  2. 有状态流数据砖文档
  3. 可变分布式共享缓存 Ignite RDD

推荐