我在具有244GB内存的32核系统上使用Apache Spark。我正在运行一个基于树的算法,我需要单独生长500棵树。当我有一个可以并行化为500个过程的过程时,在这种情况下,我的最佳火花设置应该是什么
我很新兴火花,spark.driver.memory,spark.executor.memory和spark.driver.maxResultSize的含义对我来说并不完全清楚。但从文档中可以看出,这些变量是优化分配的关键。
非常感谢这方面的任何帮助
答案 0 :(得分:1)
以下是如何为应用程序分配静态资源
您的群集资源总数是多少 总核心32 总RAM 244 GB
首先应为操作系统分配1个核心和1 GB,留下243 GB RAM和33个核心
Core是Spark中的并发级别,因此您拥有33个内核,可以同时运行33个并发进程。
接下来计算执行者的数量。每个执行程序都在自己的JVM进程中运行,每个Worker节点都可以运行多个执行程序。建议每个执行程序最多具有5个并发进程,否则在单个JVM实例中将无法管理争用量并发进程。因此,您需要在单个Worker节点上运行多个执行程序。 33/5 = 6.6并将其四舍五入为6因此可以有6个执行器
将6个执行器中的243 GB RAM分成40.5,每个执行器将其舍入为40 GB
因此,在您的情况下,您将设置以下属性
Number of cores for each executor = 5
Number of Executors = 6
RAM = 40 GB
现在谈谈你的另一个问题,即追随属性的目的 spark.driver.memory 是运行驱动程序进程所需的内存。由于我们在四舍五入时留下了一些内存,因此驱动程序有足够的内存
spark.executor.memory 我们为上面的每个执行者计算为40 GB。这是每个执行程序可用的内存
spark.driver.maxResultSize ,这是火花作业运行后的最大尺寸,结果将返回给驱动程序。如果我们将其设置为1 GB并且返回结果大于1 GB,那么我们可能会出现内存不足异常。