上下文: 我有一段应用程序代码/逻辑,可以执行一些计算并将大量数据推入内存。当前正在应用服务器中运行,并且运行时间过长。
我们正在将同一应用程序迁移到Spark群集(2.3),以便在多个执行程序中并行执行引用的逻辑。
当在服务器中执行代码时,它会增加20gb的堆,但是在Spark执行器中,我可以执行的最小代码是55g(spark.executory.memory)。如果我尝试50g-> OOM
执行程序代码被改编为从一个瘦Java类实例开始,该实例表示此逻辑的一组配置,几乎没有空间使用。逻辑本身在映射运算符中运行,该运算符基于引用的输入进行计算。 在简单的情况下会发生这种情况-1个数据集只有1个条目,因此不会造成随机播放或其他任何因素。
正如我在https://0x0fff.com/spark-memory-management/中所读的,我可以切换 spark.memory.fraction 以使用更多的用户内存,这是我的应用程序数据将从描述中消耗的内存空间,但这似乎不起作用。 在未设置spark.memory.fraction(将使用0.6)和 spark.executor.memory = 55g的情况下,它完成了执行,但是如果我将内存切换为50并尝试 spark.memory.fraction, 设置为0.2的较低值,以便我可以利用用户内存,结果是相同的。
有任何线索吗?