如何解决 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
请随意尝试这些配置以满足您的需要。
我想在 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
请求的 vcorespark.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
请随意尝试这些配置以满足您的需要。