Apache spark Spark&x2B;带输入尺寸的纱线刻度存储器

Apache spark Spark&x2B;带输入尺寸的纱线刻度存储器,apache-spark,pyspark,yarn,Apache Spark,Pyspark,Yarn,我正在用pyspark在纱线簇上运行spark。我有一个数据集,它要求每个键加载几个二进制文件,然后运行一些难以分解为部分的计算,因此它通常必须对单个键的所有数据进行操作 目前,我将spark.executor.memory和spark.Thread.executor.memoryOverhead设置为“sane”值,这些值在大多数时间都有效,但是某些键的数据量远大于平均值,在这些情况下,内存不足,执行器最终被杀死 我目前正在执行以下操作之一: 1) 使用默认内存设置运行作业,并在某些键出现故障

我正在用pyspark在纱线簇上运行spark。我有一个数据集,它要求每个键加载几个二进制文件,然后运行一些难以分解为部分的计算,因此它通常必须对单个键的所有数据进行操作

目前,我将spark.executor.memory和spark.Thread.executor.memoryOverhead设置为“sane”值,这些值在大多数时间都有效,但是某些键的数据量远大于平均值,在这些情况下,内存不足,执行器最终被杀死

我目前正在执行以下操作之一: 1) 使用默认内存设置运行作业,并在某些键出现故障时使用更多内存重新运行作业 2) 如果我知道我的一个键有更多的数据,我可以为整个作业扩展内存,但是这有一个缺点,那就是大大减少了我得到的运行容器的数量/并行运行的作业的数量


理想情况下,我会有一个系统,在这个系统中,我可以发送一个作业,并拥有一个执行器规模与输入大小的内存,但我知道这不是spark的模型。是否有任何额外的设置可以帮助我在这里或任何技巧来处理这个问题?有什么明显的问题需要解决吗?

您可以测试以下方法:将执行器内存和执行器纱线开销设置为最大值,然后添加
spark.executor.cores
,数字大于1(从2开始)。另外将
spark.task.maxFailures
设置为某个大数字(比如10)

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


让我知道它是否对您有效。

这有点有效,但在长时间运行的作业中仍然是半片状的,并且有一部分时间我最终仍然会出现完全作业失败(即使maxFailures[>30-50])。但还是比以前好多了。非常感谢。