我正在构建一个将在Dataproc上运行的Spark应用程序。我计划使用临时集群,并为应用程序的每次执行启动一个新集群。所以我基本上希望我的工作尽可能多地占用集群资源,并且我对需求有一个很好的了解。
我一直在尝试关闭动态分配并自己设置执行程序实例和核心。目前我正在使用 6 个实例和 30 个核心。
也许这更像是一个纱线问题,但我发现容器 vCore 和我的 Spark 执行器核心之间的关系有点令人困惑。在 YARN 应用程序管理器 UI 中,我看到生成了 7 个容器(1 个驱动程序和 6 个执行程序(,每个容器使用 1 个 vCore。但是,在 Spark 中,我看到执行程序本身正在使用我指定的 30 个内核。
所以我很好奇执行器是否试图在本质上是一个 1 核心盒子上并行执行 30 个任务。或者,AM GUI 中显示的 vCore 可能是错误的?
如果是前者,想知道设置此应用程序的最佳方法是什么,以便我最终为每个工作节点使用一个执行程序,并且使用所有 CPU。
YARN GUI 中显示的 vCore 是错误的;这是一个没有充分文档记录但已知问题capacity-scheduler
,这是 Dataproc 的默认值。值得注意的是,在 Dataproc 上的默认设置下,YARN 仅基于内存而不是 CPU 进行资源箱打包;好处是,这对于根据所需的每个工作负载在不同程度上超额订阅 CPU 来说更通用,尤其是在某些内容受 IO 限制的情况下,但缺点是 YARN 不会负责以固定的方式划分 CPU 使用率。
有关更改为fair-scheduler
以查看 YARN 中准确表示的 vcore 分配的一些讨论,请参阅 https://stackoverflow.com/a/43302303/3777211。但是,在您的情况下,这样做可能没有任何好处;让 YARN 跨两个维度进行二进制打包更像是一个"共享多租户集群"问题,只会使调度问题复杂化。
在您的情况下,设置应用程序的最佳方法是忽略 YARN 对 vcore 的说法;如果每个工作器节点只需要一个执行程序,则将执行程序内存大小设置为每个节点 YARN 中可容纳的最大大小,并使每个执行程序的核心数等于每个节点的核心总数。