【问题标题】:Memory usage in Spark stand alone setupSpark 独立设置中的内存使用情况
【发布时间】:2018-03-29 15:22:10
【问题描述】:

我有一个带有 6 个核心的单个工人的火花设置。现在我向工人广播一个对象 x。 我有三个问题-

  1. 对于 map reduce 作业,我的 obj x 将生成 6 个副本,还是 x 的单个副本将由所有内核共享?

  2. x 的生命周期是什么,即;它什么时候会被摧毁。我问是因为这个对象 x 占用了大量的内存。

  3. 如果我从文件中读取该对象,是否有其他方法可以在所有 6 个内核之间共享该对象。

【问题讨论】:

  • 如果它是一个独立的设置并且你有一台机器..不需要使用广播变量。广播变量通常用于向多个节点发送消息。
  • 是的,我明白了。但是,我怎样才能节省内存,因为所有进程都会拥有同一个对象的副本,这会破坏内存。既然是只读对象,有什么办法可以节省内存吗?

标签: apache-spark hadoop mapreduce distributed-computing


【解决方案1】:

广播数据在每个执行程序(java 进程)中传输和存储一次,而不是每个内核一次。换句话说,如果您有一个节点,并且您将 spark.executor.instances 设置为 2,并将 spark.executor.cores 设置为 3,您最终会得到节点上的两个 java 进程,每个进程都有一份数据副本。这是使用广播而不是仅使用闭包将数据传递到执行程序代码的好处之一。

关于生命周期,当驱动程序上的广播句柄不再有任何引用时,广播数据将被删除。这也意味着在使用该广播数据的任何任务运行之后。如果您查看 spark 日志,您将在发生这种情况时看到类似于“已删除广播”的消息。

【讨论】:

  • 有什么办法可以节省内存吗?因为该对象将在所有进程之间复制?
  • 如果每个节点只有 1 个执行程序进程(具有多个核心),那么每个节点上的 RAM 中只有一个副本。你怎么能把它减少到小于1?任何其他内存节省都需要您减少共享对象的大小。
  • 谢谢。我将通过更改执行器的数量和每个执行器的核心数来检查内存和时间消耗统计信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多