Spark 作业内部结构

Spark Job Internals

我试着浏览了各种帖子,但没有得到答案。假设我的 spark 作业有 1000 个输入分区,但我只有 8 个执行程序核心。这项工作有 2 个阶段。有人可以帮助我准确理解 spark 是如何处理这个的。如果您能帮忙回答以下问题,我将不胜感激

  1. 因为只有 8 个执行器内核,spark 会一次处理 8 个分区的作业的 Stage 1 吗?
  2. 如果以上为真,在处理完第一组 8 个分区后,当 spark 是 运行 第二组 8 个分区时,这些数据存储在哪里?
  3. 如果我没有任何广泛的转换,这会导致溢出到磁盘吗?
  4. 对于 spark 作业,最佳文件大小是多少。我的意思是处理 1 MB 文件和 1000 个 spark 分区时 spark 更好,或者说 10MB 文件有 100 个 spark 分区?

抱歉,如果这些问题含糊不清。这不是一个真正的用例,但在我学习 spark 时,我试图了解如何处理不同分区的内部细节。

谢谢!

Spark 将 运行 第一阶段的所有作业,然后再开始第二阶段。这并不意味着它会启动 8 个分区,等待它们全部完成,然后再启动另外 8 个分区。相反,这意味着每次执行程序完成一个分区时,它会从第一阶段开始另一个分区,直到第一阶段的所有分区都启动,然后 spark 会等到第一阶段的所有阶段都完成后再开始第二阶段.

数据存储在内存中,或者如果没有足够的可用内存,则溢出到执行程序内存上的磁盘。是否发生溢出将取决于可用内存量以及中间数据结果量。

最佳文件大小各不相同,并且是最佳测量值,但需要考虑一些关键因素:

  1. 文件总数限制了总并行度,因此应该大于核心数。
  2. 用于处理分区的内存量应小于执行程序可用的内存量。 (AWS 胶水约 4GB)
  3. 每个文件读取都有开销,所以您不希望有太多小文件。

如果你只有 8 个内核,我会倾向于 10MB 或更大的文件。