问题 如何解决火花上纱线容器上浆的问题?


我想开展一些pyspark工作 YARN。我有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)

因此,我得到一个带有错误输出的非常长的火花日志。最重要的信息是:

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

如果您还有其他想要了解的设置,请告诉我们。

如何正确设置纱线容器尺寸?
(对于可以帮助我的人的路上的赏金)


1021
2018-04-04 18:18


起源

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


答案:


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

注意: YARN中的容器相当于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 是每个纱线容器可以分配的最大vcores数。

例: 如果一个节点有16GB和8vcores,并且你想将14GB和6vcores贡献给集群(对于容器),那么设置属性如下所示:

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将用于集群。这是因为群集只有6vcores可用。

现在在Spark方面,

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

spark.driver.memory

spark.executor.memory

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

spark.driver.cores

spark.executor.cores

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

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

spark.executor.instances

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

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

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

内存可用:10GB * 2个节点 Vcores可用: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,1vcore。

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

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


10
2018-05-04 11:45



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