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

Posted

技术标签:

【中文标题】如何解决 Spark 上的纱线容器尺寸问题?【英文标题】:How to solve yarn container sizing issue on spark? 【发布时间】:2017-04-04 18:18:46 【问题描述】:

我想在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-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

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

如何正确设置纱线中的容器大小? (赏金正在寻找可以帮助我的人)

【问题讨论】:

尝试使用更高的执行程序内存“ pyspark --master yarn --driver-memory 2g --executor-memory 4g”启动您的 Pyspark 会话 我会试试的。这与纱线容器大小有什么关系? 执行器在 YARN 容器中运行。通过定义执行器内存你的容器大小。 没有开销内存大小? @Rags 我认为这是不正确的。 executor 大小不一定是 YARN 容器的大小。 【参考方案1】:

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

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

在 yarn-site.xml:

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

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

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

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

示例:如果一个节点有 16GB 和 8 个 vcore,并且您想为集群贡献 14GB 和 6 个 vcore(用于容器),则设置属性如下所示:

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 个 vcore 可用。

现在在 Spark 方面,

以下属性指定每个执行程序/容器要请求的内存

spark.driver.memory

spark.executor.memory

以下属性指定每个执行程序/容器要请求的 vcores

spark.driver.cores

spark.executor.cores

IMP: 所有 Spark 的 memory 和 vcore 属性都应小于或等于 YARN 的配置

以下属性指定可用于 YARN 集群中的 spark 应用程序的执行器/容器的总数。

spark.executor.instances

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

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

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

可用内存:10GB * 2 个节点 可用 Vcor​​es:5 * 2 vcores [假设]

在 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.memory1536mb

spark.yarn.executor.memoryOverhead512mb

spark.executor.memory1536mb

spark.yarn.executor.memoryOverhead512mb

spark.driver.cores1

spark.executor.cores1

spark.executor.instances19

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

【讨论】:

谢谢@code。现在,我很想知道更多关于属性yarn.scheduler.maximum-allocation-mbyarn.scheduler.minimum-allocation-mb 的信息。为什么不总是让yarn.scheduler.maximum-allocation-mbyarn.nodemanager.resource.memory-mb 一样大,而让yarn-scheduler.minimum-allocation-mb 尽可能小呢?这样,您总是有足够的空间来支持最大的执行器,并且您总是有足够的粒度来支持不超过最小所需的内存? 最后:我们不需要为操作系统等节省空间,所以我们应该将yarn.nodemanager.resource.memory-mb 设置为小于 10G,比如 8192 GB? 您可以使yarn.scheduler.maximum-allocation-mbyarn.nodemanager.resource.memory-mb 一样大,并使yarn-scheduler.minimum-allocation-mb 尽可能小。因为 Spark 是要请求资源的人,因此应该对其进行配置,以便充分利用资源并实现更好的并行性。谈到第二个问题,你是对的,你必须为操作系统和其他系统服务留出一些空间和 vcore(我虽然你的节点有 10GB 不包括操作系统要求)。根据我的经验,对于基于 Linux 的服务器来说,1vcore 和 2gb 就足够了。 所以没有充分的理由让yarn.scheduler.maximum-allocation-mb 小于yarn.nodemanager.resource.memory-mb,对吗? (非常感谢您的回答) 如果你只在 YARN 集群上运行 Spark,那么我看不出有什么好的理由。虽然不确定 Spark 的动态资源分配。在动态资源分配的情况下,为了限制资源请求,这些属性可能会变得有用。

以上是关于如何解决 Spark 上的纱线容器尺寸问题?的主要内容,如果未能解决你的问题,请参考以下文章

纱线上的 Spark Jobs |性能调优和优化

YARN 上的 Spark 使用的 vcore 太少

spark 提交 pyspark 脚本上的纱线投掷超过最大递归深度

sparklyr 可以与部署在纱线管理的 hadoop 集群上的 spark 一起使用吗?

如何提高纱线应用并行度

纱线上的哪个目录触发应用程序将其日志输出到?每个节点中的 spark.eventLog.dir 或 var/log/?