我已经阅读了火花文档以及其他相关的Q& As,但是我仍然不清楚Spark Broadcast变量的一些细节,特别是粗体语句:
Spark动作通过一组阶段执行,由分布式“shuffle”操作分隔。 Spark会自动广播每个阶段中任务所需的公共数据。以这种方式广播的数据以序列化形式缓存并在运行每个任务之前反序列化。这意味着显式创建广播变量仅在跨多个阶段的任务需要相同数据或以反序列化形式缓存数据时非常有用。
谢谢!
答案 0 :(得分:1)
您的问题几乎包含了您需要的所有答案。
什么是“常见数据”?
由多个执行者引用/读取的数据。例如,字典查找。假设您有100个执行程序运行需要进行大量字典查找的任务。如果没有广播变量,您可以在每个执行程序中加载此数据。使用广播变量,您只需加载一次,所有执行程序将引用相同的字典。因此,您节省了大量空间。
更多详情:https://blog.knoldus.com/2016/04/30/broadcast-variables-in-spark-how-and-when-to-use-them/
如果变量仅用于1个阶段,是否意味着广播它无用,无论其内存占用多少?
不,是的。不,如果您的单个阶段有数百到数千个执行者!是的,如果你的舞台上有几个执行者。
由于广播有效地“引用”每个执行器上的变量而不是多次复制它,在什么情况下广播是一个坏主意?我的意思是为什么这种广播行为不是默认的火花行为?
以这种方式广播的数据以序列化形式缓存并在运行每个任务之前进行反序列化。因此,如果广播的数据非常庞大,序列化和反序列化将成为代价高昂的操作。所以在这种情况下你应该避免使用广播变量。