我刚刚创建了一个 7 节点的火花集群,每个工作线程都有 8GB 内存和 4 个内核。它不是一个巨大的集群,但因"超出 GC 开销限制"而失败对于一个简单的 terasort,只有 10GB 的数据。
我想知道如何确定 Spark 群集的这些基本参数,以便作业不会随着数据大小的增长而失败。
- 执行者数量
- 分区数
- 排比
- 执行程序核心
- 执行程序内存
如果没有正确配置,我不介意作业运行缓慢,但由于内存不足而导致的进程死亡是一个很大的危险信号。
一些信息,如火花版本,输入格式(文本,镶木地板,兽人),压缩等肯定会有所帮助。
但简而言之,以下通常是经验法则。
- 执行程序数 - 这是整个群集将用于此作业的执行程序总数。执行程序可以包含一个或多个任务。人们倾向于认为一个节点=一个执行者。最好每个节点有多个执行程序。稍后在答案中对此进行更多介绍。
- 执行程序核心数 - 这是每个执行程序的核心(任务)总数。在您的情况下,起点是每个执行器(即每个节点)4 个核心。
- 执行程序内存 - 每个执行程序的总内存。这由执行器中的所有任务或核心共享。
最有可能的配置(但效果较差)执行程序数=7,执行程序核心数=4,执行程序内存数=8g在这种情况下,一个执行程序由 4 个任务共享。如果其中一个失败,则整个执行程序将标记为失败。
更好的配置num-executors=14(每个节点 2 个),executor-cores=2(每个执行程序 2 个),executor-memory=3g(每个执行程序 3g,其余进程剩下 2g)
请注意,每个执行程序 1 个内核也不好,因为在这种情况下执行程序启动时间可能太多。
在这种情况下,您正在划分资源以避免杀死整个执行程序。
排比这取决于输入数据的格式。