【问题标题】:what is the disadvantages of spark broadcast variable?spark广播变量的缺点是什么?
【发布时间】:2017-01-11 00:14:30
【问题描述】:

我已阅读 SO 中的 spark doc 和其他相关 Q&A,但我仍然不清楚 Spark Broadcast 变量的一些细节,尤其是粗体声明:

Spark 动作通过一组阶段执行,由分布式“shuffle”操作分隔。 Spark 会自动广播每个阶段内任务所需的公共数据。以这种方式广播的数据以序列化形式缓存,并在运行每个任务之前进行反序列化。这意味着仅当跨多个阶段的任务需要相同数据或以反序列化形式缓存数据很重要时,显式创建广播变量才有用

  1. 什么是“公共数据”?
  2. 如果变量只在 1 个阶段使用,是否意味着无论其内存占用如何,广播它都没有用?
  3. 既然广播有效地“引用”了每个执行程序上的变量而不是多次复制它,那么在什么情况下广播是一个坏主意?我的意思是为什么这种广播行为不是默认的 spark 行为?

谢谢!

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    您的问题几乎有您需要的所有答案。

    什么是“公共数据”?

    多个执行者引用/读取的数据。例如,字典查找。假设您有 100 个执行程序运行需要大量字典查找的任务。如果没有广播变量,您将在每个执行程序中加载此数据。使用广播变量,您只需加载一次,所有执行程序都将引用同一个字典。因此,您可以节省大量空间。

    更多详情:https://blog.knoldus.com/2016/04/30/broadcast-variables-in-spark-how-and-when-to-use-them/

    如果变量只在 1 个阶段使用,是否意味着无论其内存占用如何,广播它都没有用?

    不是和是。不,如果您的单个阶段有成百上千的执行者!是的,如果你的 stage 有很少的执行者。

    由于广播有效地“引用”每个执行程序上的变量而不是多次复制它,在什么情况下广播是一个坏主意?我的意思是为什么这种广播行为不是默认的 spark 行为?

    以这种方式广播的数据以序列化的形式缓存起来,并在运行每个任务之前进行反序列化。 所以,如果广播的数据非常非常庞大,序列化和反序列化就成为代价高昂的操作。所以在这种情况下你应该避免使用广播变量。

    【讨论】:

    • 我印象深刻的是,即使使用广播,变量也需要对每个执行程序进行序列化和反序列化(但在每个执行程序内的任务之间共享)?我认为对于 Q1,我的问题是“自动”广播哪种/类型的数据,如果我有一个 List/Map/Set,它们会自动广播吗?如果我有一个自定义对象(假设可序列化)
    • 我误解了你的第一个问题。我添加了一个可以回答您问题的参考资料。
    • 关于I was under the impress that even with broadcasting, the variable will also need to serialize and deserialize per executor (but shared across tasks within each executor)?广播变量文档解释它explicitly creating broadcast variables is only useful when tasks across multiple stages need the same data or when caching the data in deserialized form is important.
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多