在Apache spark中,使用mapPartitions和结合使用broadcast variable和map有什么区别

xua*_*yue 5 java scala apache-spark

在 Spark 中,我们使用广播变量来使每台机器都有一个变量的只读副本。我们通常会在闭包之外创建一个广播变量(比如闭包需要的查找表)来提高性能。

我们还有一个叫做 mapPartitions 的 spark 转换操作符,它试图实现同样的目标(使用共享变量来提高性能)。例如,在 mapPartitions 中,我们可以为每个分区共享一个数据库连接。

那么这两者有什么区别呢?我们可以仅将它用于共享变量吗?

Kri*_*isP 6

broadcast用于将对象运送到每个工作节点。该对象将在该节点上的所有分区之间共享(并且值/即对象对于集群中的每个节点都是相同的)。当您在工作节点上的许多不同任务/分区中使用相同数据时,广播的目标是节省网络成本。

mapPartitions相比之下, 是 RDD 上可用的方法,并且map只在分区上工作。是的,您可以定义新对象,例如 jdbc 连接,然后这些对象对于每个分区都是唯一的。但是,您不能在不同分区之间共享它,更不用说在不同节点之间共享了。

  • 从某种意义上说,是的。然而,用法(特别是语法)是如此不同,以至于我会犹豫在这两种情况之间进行比较。通常您广播一个现有的数据数组,但在 mapPartitions 中,您在该级别创建一个新对象。顺便说一句,广播是在集群级别,而不是节点级别。 (2认同)