当您持久化RDD时,每个节点都会在内存中存储它所计算的RDD的任何分区,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用它们。这使得未来的操作更快(通常快10倍以上)。* 缓存是迭代算法和快速交互使用的关键工具。* 每个持久化RDD都可以使用不同的存储级别进行存储,例如,允许您将数据集持久化在磁盘上,将其作为序列化的Java对象持久化在 * 内存 * 中(以保存空间),* 在节点之间复制它 *,或者将其存储在 * 堆外 * 广播变量允许程序员在每台机器上缓存一个只读变量,而不是将它的副本随任务一起发送。例如,它们可以有效地为每个节点提供一个大型输入数据集的副本。Spark还尝试使用高效的广播算法来分发广播变量,以降低通信成本。 您可以在此documentation页面找到更多详细信息。 有用的帖子: Advantage of Broadcast Variables What is the difference between cache and persist?
5条答案
按热度按时间yjghlzjz1#
**cache()或persist()**允许跨操作使用数据集。
当您持久化RDD时,每个节点都会在内存中存储它所计算的RDD的任何分区,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用它们。这使得未来的操作更快(通常快10倍以上)。* 缓存是迭代算法和快速交互使用的关键工具。*
每个持久化RDD都可以使用不同的存储级别进行存储,例如,允许您将数据集持久化在磁盘上,将其作为序列化的Java对象持久化在 * 内存 * 中(以保存空间),* 在节点之间复制它 *,或者将其存储在 * 堆外 *
广播变量允许程序员在每台机器上缓存一个只读变量,而不是将它的副本随任务一起发送。例如,它们可以有效地为每个节点提供一个大型输入数据集的副本。Spark还尝试使用高效的广播算法来分发广播变量,以降低通信成本。
您可以在此documentation页面找到更多详细信息。
有用的帖子:
Advantage of Broadcast Variables
What is the difference between cache and persist?
gpnt7bae2#
你能告诉我在什么情况下我应该使用rdd.cache()和rdd.broadcast()方法吗?
RDD被划分为 * 分区 *。这些分区本身充当整个RDD的不可变子集。当Spark执行图的每个阶段时,每个分区被发送到一个工作者,该工作者对数据子集进行操作。反过来,如果RDD需要重新迭代,每个工作者可以 * 缓存 * 数据。
广播变量用于将一些不可变的状态 * 一次 * 发送给每个工作线程。当你需要一个变量的本地副本时,可以使用它们。
这两个操作彼此非常不同,并且每一个都代表不同问题的解决方案。
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在第一次使用时将它保存在内存中,然后下次我们需要对它进行一些变换时,我们已经将它保存在内存中了。
l7mqbcuq4#
用例
当您想要多次使用对象时,可以快取或广播对象。
您只能缓存RDD或RDD派生对象,而可以广播任何类型的对象,包括RDD。
当我们处理RDD/DataFrame/DataSet时,我们使用 cache(),并且我们希望多次使用数据集,而不是每次都重新计算它。
我们 * 广播 * 一个对象,当
1.我们正在处理相对较小的RDD/DataFrame/DataSet,广播它比缓存提供了性能优势(例如,如果我们在连接中使用数据集)
1.我们处理的是一个普通的Scala/Java对象,它将在作业的多个阶段使用。
9gm1akwq5#
相似点
差异
广播
缓存
show()
每次执行都很慢)。用例