如何解决 spark 上的纱线容器尺寸问题?

How to solve yarn container sizing issue on spark?

我想在 YARN 上启动一些 pyspark 作业。我有 2 个节点,每个节点有 10 GB。我可以像这样打开 pyspark shell:pyspark

现在,当我尝试启动一个非常简单的示例时:

import random
NUM_SAMPLES=1000
def inside(p):
    x, y = random.random(), random.random()
    return x*x + y*y < 1

count = sc.parallelize(xrange(0, NUM_SAMPLES)) \
             .filter(inside).count()
print "Pi is roughly %f" % (4.0 * count / NUM_SAMPLES)

结果我得到一个很长的带有错误输出的 spark 日志。最重要的信息是:

ERROR cluster.YarnScheduler: Lost executor 1 on (ip>: Container marked as failed: <containerID> on host: <ip>. Exit status 1.  Diagnostics: Exception from container-launch.  ......

稍后在日志中我看到...

ERROR scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times: aborting job
INFO cluster.YarnClientSchedulerBackend: Asked to remove non-existent executor 1
INFO spark.ExecutorAllocationManager: Existing executor 1 has been removed (new total is 0)

根据我从上面的日志中收集到的信息,这似乎是 yarn 中的容器大小问题。

我的 yarn-site.xml 文件具有以下设置:

yarn.scheduler.maximum-allocation-mb = 10240
yarn.nodemanager.resource.memory-mb = 10240

并且在 spark-defaults.conf 中包含:

spark.yarn.executor.memoryOverhead=2048
spark.driver.memory=3g

如果您想了解任何其他设置,请告诉我。

如何在 yarn 中适当地设置容器大小?
(有人可以帮助我的赏金)

首先让我解释一下在 YARN 集群上调整 Spark 应用程序所需的基本属性集。

注:YARN中的Container相当于Spark中的Executor。为了便于理解,您可以认为两者相同。

上纱-site.xml:

yarn.nodemanager.resource.memory-mb 是集群从给定节点可用的总内存。

yarn.nodemanager.resource.cpu-vcores 是来自给定节点的群集可用的 CPU vcore 总数。

yarn.scheduler.maximum-allocation-mb 是每个 yarn 容器可以分配的最大内存(以 mb 为单位)。

yarn.scheduler.maximum-allocation-vcores 是每个 yarn 容器可以分配的最大 vcores 数。

示例:如果一个节点有 16GB 和 8 个 vcores,你想为集群贡献 14GB 和 6 个 vcores(用于容器),然后设置如下所示的属性:

yarn.nodemanager.resource.memory-mb : 14336 (14GB)

yarn.nodemanager.resource.cpu-vcores : 6

并且,要创建每个 2GB 和 1vcore 的容器,请设置这些属性:

yarn.scheduler.maximum-allocation-mb : 2049

yarn.scheduler.maximum-allocation-vcores : 1

注意:即使有足够的内存(14gb)创建7个2GB的容器,上面的配置只会创建6个2GB的容器,14GB中只有12GB会被创建用于集群。这是因为集群只有 6 个 vcores 可用。

现在在 Spark 端,

以下属性指定每个 executor/container

请求的内存

spark.driver.memory

spark.executor.memory

以下属性指定每个 executor/container

请求的 vcore

spark.driver.cores

spark.executor.cores

IMP: 所有 Spark 的内存和 vcore 属性应该小于或等于 YARN 的配置

下面属性指定了YARN集群中可用于您的spark应用程序的总数executors/containers。

spark.executor.instances

这个 属性 应该小于 YARN 集群中可用的容器总数。

yarn 配置完成后,spark 应该请求可以根据 YARN 配置分配的容器。这意味着,如果 YARN 配置为每个容器最多分配 2GB,而 Spark 请求一个具有 3GB 内存的容器,那么作业将暂停或停止,因为 YARN 无法满足 spark 的请求。

现在您的用例: 通常,集群调整基于工作负载。但是下面的配置应该更合适。

可用内存:10GB * 2 个节点 可用核数:5 * 2 个核数[假设]

On yarn-site.xml [在两个节点]

yarn.nodemanager.resource.memory-mb : 10240

yarn.nodemanager.resource.cpu-vcores : 5

yarn.scheduler.maximum-allocation-mb : 2049

yarn.scheduler.maximum-allocation-vcores : 1

使用上面的配置,您可以在每个节点上创建最多 10 个容器,每个节点有 2GB,1 个 vcore。

Spark 配置

spark.driver.memory 1536mb

spark.yarn.executor.memoryOverhead 512mb

spark.executor.memory 1536mb

spark.yarn.executor.memoryOverhead 512mb

spark.driver.cores 1

spark.executor.cores 1

spark.executor.instances 19

请随意尝试这些配置以满足您的需要。