Spark +纱线 - 输入尺寸

时间:2017-02-03 15:27:41

标签: apache-spark pyspark yarn

我正在使用pyspark在纱线群上运行火花。我有一个数据集,需要为每个密钥加载几个二进制文件,然后运行一些难以分解成部分的计算 - 因此它通常必须跨单个密钥的所有数据进行操作。

目前,我将spark.executor.memory和spark.yarn.executor.memoryOverhead设置为" sane"在大多数情况下工作的值,但是某些键最终会有比平均值大得多的数据,并且在这些情况下,内存不足并且执行程序最终会被杀死。

我目前正在执行以下操作之一: 1)使用默认内存设置运行作业,并在某些键因内存更多而失败时重新运行 2)如果我知道我的一个密钥有更多的数据,我可以扩大整个作业的内存,但是这有一个缺点,即大大减少我获得的运行容器数量/并行运行的作业数量。

理想情况下,我会有一个系统,我可以发送一份工作,并以输入大小的执行器规模记忆,但我知道这不是火花的模型。是否有任何额外的设置可以帮助我在这里或任何处理这个问题的技巧?我有什么明显的缺失作为修复?

1 个答案:

答案 0 :(得分:0)

您可以测试以下方法:将执行程序内存和执行程序纱线开销设置为最大值,并添加数字大于1的spark.executor.cores(从2开始)。另外将spark.task.maxFailures设置为一些大数字(比方说10)。

然后在正常大小的键上,spark可能像往常一样完成任务,但是一些具有较大键的分区会失败。它们将被添加到重试阶段,因为要重试的分区数将远低于初始分区,spark会将它们均匀地分配给执行程序。如果分区数量的执行器数量较少或相等,则每个分区与初始执行相比将具有两倍的内存,并且可能会成功。

让我知道它是否适合你。