Spark缓存与广播

n3schb8v  于 2022-11-16  发布在  Apache
关注(0)|答案(5)|浏览(185)

看起来broadcast方法在我的集群中创建了RDD的分布式副本,而cache()方法的执行只是将数据加载到内存中。
但是我不明白缓存的RDD是如何在集群中分布的。
请问在什么情况下应该使用rdd.cache()rdd.broadcast()方法?

yjghlzjz

yjghlzjz1#

**cache()persist()**允许跨操作使用数据集。

当您持久化RDD时,每个节点都会在内存中存储它所计算的RDD的任何分区,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用它们。这使得未来的操作更快(通常快10倍以上)。* 缓存是迭代算法和快速交互使用的关键工具。*
每个持久化RDD都可以使用不同的存储级别进行存储,例如,允许您将数据集持久化在磁盘上,将其作为序列化的Java对象持久化在 * 内存 * 中(以保存空间),* 在节点之间复制它 *,或者将其存储在 * 堆外 *
广播变量允许程序员在每台机器上缓存一个只读变量,而不是将它的副本随任务一起发送。例如,它们可以有效地为每个节点提供一个大型输入数据集的副本。Spark还尝试使用高效的广播算法来分发广播变量,以降低通信成本。
您可以在此documentation页面找到更多详细信息。
有用的帖子:
Advantage of Broadcast Variables
What is the difference between cache and persist?

gpnt7bae

gpnt7bae2#

你能告诉我在什么情况下我应该使用rdd.cache()和rdd.broadcast()方法吗?
RDD被划分为 * 分区 *。这些分区本身充当整个RDD的不可变子集。当Spark执行图的每个阶段时,每个分区被发送到一个工作者,该工作者对数据子集进行操作。反过来,如果RDD需要重新迭代,每个工作者可以 * 缓存 * 数据。
广播变量用于将一些不可变的状态 * 一次 * 发送给每个工作线程。当你需要一个变量的本地副本时,可以使用它们。
这两个操作彼此非常不同,并且每一个都代表不同问题的解决方案。

g52tjvyc

g52tjvyc3#

你能告诉我在什么情况下我应该使用rdd.cache()和rdd.broadcast()方法吗?
让我们举一个例子--假设你有一个employee_salary数据,其中包含每个雇员的部门和薪金。现在假设任务是找到每个雇员的平均部门薪金的分数。(如果雇员e1的部门是d1,我们需要找到e1.salary/average(d1中的所有薪金))。
一种方法是--首先将数据读入一个rdd --比如rdd 1。然后依次执行两个操作 *-
首先,使用rdd 1 * 计算部门的平均工资。最终将在驱动程序上得到部门平均工资结果--基本上是一个包含deptId与average的Map对象。
其次,您需要使用此结果将每个员工的薪金除以其各自部门的平均薪金。请记住,每个员工可能有来自任何部门的员工,因此您需要访问每个员工的部门平均薪金结果。如何执行此操作?您可以通过广播将从司机那里获得的平均工资Map发送给每个工人,然后可以使用它来计算rdd 1中每一“行”的工资分数。
那么缓存RDD呢?请记住,从初始的rdd 1开始,有两个计算分支--一个用于计算部门平均值,另一个用于将这些平均值应用于rdd中的每个雇员。现在,如果不缓存rdd 1,那么对于上面的第二个任务,您可能需要再次回到磁盘来读取和重新计算它,因为到那时spark可能已经从内存中逐出了这个rdd你到达了这一点,但是由于我们知道我们将使用相同的rdd,我们可以要求Spark在第一次使用时将它保存在内存中,然后下次我们需要对它进行一些变换时,我们已经将它保存在内存中了。

  • 我们可以使用基于部门的分区,这样您就可以避免广播,但出于说明的目的,假设我们不这样做。
l7mqbcuq

l7mqbcuq4#

用例

当您想要多次使用对象时,可以快取或广播对象。
您只能缓存RDD或RDD派生对象,而可以广播任何类型的对象,包括RDD。
当我们处理RDD/DataFrame/DataSet时,我们使用 cache(),并且我们希望多次使用数据集,而不是每次都重新计算它。
我们 * 广播 * 一个对象,当
1.我们正在处理相对较小的RDD/DataFrame/DataSet,广播它比缓存提供了性能优势(例如,如果我们在连接中使用数据集)
1.我们处理的是一个普通的Scala/Java对象,它将在作业的多个阶段使用。

9gm1akwq

9gm1akwq5#

相似点

  • 这两种机制都是为了在Spark中提高性能而提供的。
  • 其主要目标是使数据更容易获得,以便进行快速、高效的处理。

差异

广播

  • 不是懒评操作。
  • 通常,建议用于小型数据集
  • 广播是指向每一位遗嘱执行人提供一份数据副本
  • 由于每个执行者已经具有计算所需的数据,因此数据通信成本得以降低。
缓存
  • 是一个懒评操作。
  • 当RDD没有被缓存时,对于RDD上的每个操作,Spark将重新处理该操作所需的所有步骤(例如,show()每次执行都很慢)。
  • 缓存将存储已处理的数据沿着计算该数据所需的步骤
  • 因此,当您多次调用该操作时,不需要额外的计算,并且处理后的数据由其所需的步骤引用。

用例

  • 广播-通过向每个执行者提供共享数据的副本,减少网络上数据的通信成本
  • 高速缓存-通过保存已处理的数据及其步骤(用于查找),减少重复操作的数据计算成本

相关问题