请参阅后续更新。
请注意我对增加此过程的并行性不感兴趣。我正在尝试了解执行程序内存模型。
让我们说我的应用程序被分解为1个阶段(几个映射器,过滤器,将结果存储到hdfs [换句话说,没有减速器] )
我们说我有:
我最终完成了10个任务,每个任务都在执行程序上成功运行。
现在相同的应用程序和相同的设置,但这次我减少了执行程序的数量:
我还有10个任务。但这次是5个执行器,并行成功执行5个任务。但是当执行程序试图执行第二组任务(任务6-10)时,执行程序试图获得超过指定数量的内存并且纱线将其杀死...
我认为应该发生的是5个任务将成功运行,然后5个任务将成功运行。由于所有任务都相同......
但看起来执行者被迫从执行前5个任务中带来一些内存占用。
跟进
执行程序失败的原因是因为我正在进行大量的字符串操作,并且配置的spark.yarn.executor.memoryOverhead
太小(512 MB)。
一旦我解决了这个问题,我就重复了实验,并且能够使用5个执行器成功处理10个任务。
我将这个问题和调查结果留在这里作为文件,以防有人有同样的问题......