我试着浏览了各种帖子,但没有得到答案。假设我的spark作业有1000个输入分区,但我只有8个executor核。这项工作有两个阶段。有人能帮我弄清楚spark是怎么处理的吗。如果你能帮我回答以下问题,我将不胜感激
由于只有8个执行器内核,spark会一次处理8个分区吗?
如果以上是真的,那么在处理第一组8个分区之后,当spark运行第二组8个分区时,这些数据存储在哪里?
如果我没有任何大范围的转换,这会导致磁盘溢出吗?
对于spark作业,最佳文件大小是多少。我的意思是spark处理1MB文件和1000个spark分区更好,或者说一个10mb文件和100个spark分区更好?
抱歉,如果这些问题含糊不清的话。这不是一个真正的用例,但当我学习spark时,我试图理解不同分区如何处理的内部细节。
谢谢您!
1条答案
按热度按时间yzuktlbb1#
spark将在开始第二阶段之前运行第一阶段的所有作业。这并不意味着它将启动8个分区,等待它们全部完成,然后再启动另8个分区。相反,这意味着每次执行器完成一个分区时,它都会从第一阶段启动另一个分区,直到第一阶段的所有分区都启动为止,然后spark会等到第一阶段的所有阶段都完成之后,再启动第二阶段。
数据存储在内存中,或者如果没有足够的内存可用,则溢出到执行器内存上的磁盘。溢出是否发生将取决于到底有多少内存可用,以及产生多少中间数据。
最佳文件大小是多种多样的,而且是最好的衡量标准,但需要考虑一些关键因素:
文件总数限制了总并行度,因此应该大于核心数。
处理分区时使用的内存量应小于执行器可用的内存量(~4gb用于aws胶水)
每次读取文件都有开销,所以您不需要太多的小文件。
我会倾向于10mb或更大的文件,如果你只有8个核心。