【发布时间】:2017-08-07 18:28:10
【问题描述】:
我正在尝试找出在集群节点上配置内存的最佳方式。但是,我相信为此我需要进一步了解一些事情,例如 spark 如何处理跨任务的内存。
例如,假设我有 3 个执行器,每个执行器最多可以并行运行 8 个任务(即 8 个核心)。如果我有一个有 24 个分区的 RDD,这意味着理论上所有的分区都可以并行处理。但是,如果我们在这里放大一个执行器,这假设每个任务都可以在内存中拥有它们的分区以对它们进行操作。如果不是,则意味着不会发生 8 个并行任务,需要进行一些调度。
因此我得出的结论是,如果有人寻求真正的并行性,对分区的大小有所了解会有所帮助,因为它会告诉您如何调整执行程序的大小以实现真正的并行性。
Q0 - 我只是想更好地理解一点,如果不这样做会发生什么 所有分区都可以容纳在一个执行程序中的内存中吗?有一些 溢出在磁盘上,而其他人在内存中进行操作?火花
为每个任务预留内存,如果检测到没有 够了,它会安排任务吗?或者做一个简单地跑出去
内存错误。Q1 - 真正的并行性 执行器还取决于执行器上可用的内存量? 换句话说,我的集群中可能有 8 个核心,但如果我没有 足够的内存一次加载我的数据的 8 个分区,那么我不会 完全并行。
作为最后一点,我多次看到以下声明,但发现它有点混乱:
“增加分区数量也有助于减少 内存不足错误,因为这意味着 Spark 将在 每个执行者的数据的较小子集。”
这究竟是如何工作的?我的意思是 spark 可能适用于较小的子集,但如果总的分区集无论如何都不能放入内存,会发生什么?
【问题讨论】:
标签: apache-spark spark-streaming