Apache spark 如何解决spark上的纱线容器上浆问题?

Apache spark 如何解决spark上的纱线容器上浆问题?,apache-spark,pyspark,yarn,Apache Spark,Pyspark,Yarn,我想在纱线上启动一些pyspark作业。我有2个节点,每个节点10 GB。我可以像这样打开pyspark外壳: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)

我想在
纱线
上启动一些pyspark作业。我有2个节点,每个节点10 GB。我可以像这样打开pyspark外壳:
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)
从我从上面的日志中收集到的信息来看,这似乎是纱线中的容器尺寸问题

我的
warn 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
如果您还想了解其他设置,请告诉我

如何在纱线中适当设置容器尺寸?

(悬赏即将到来,希望有人能帮助我)

首先让我解释一下在纱线簇上调整spark应用程序所需的基本属性集

注意:纱线中的容器相当于火花中的执行器。对于可理解性,你可以认为两者是相同的。 在纱线网站上。xml:

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

warn.nodemanager.resource.cpu vcores
是群集从给定节点可用的cpu vcores总数

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

warn.scheduler.maximum allocation vcores
是每个warn容器可以分配的最大vcore数

示例:如果节点具有16GB和8V存储空间,并且您希望为集群贡献14GB和6V存储空间(对于容器),则设置属性,如下所示:

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

纱线.nodemanager.resource.cpu-vcores:6

并且,要创建每个具有2GB和1V核心的容器,请设置以下属性:

warn.scheduler.maximum-allocation-mb:2049

纱线.scheduler.maximum-allocation-vcores:1

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

现在在Spark侧,

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

spark.driver.memory

spark.executor.memory

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

spark.driver.cores

spark.executor.cores

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

以下属性指定可用于纱线簇中spark应用程序的执行器/容器总数

spark.executor.instances

此属性应小于纱线簇中可用的容器总数

纱线配置完成后,spark应请求根据纱线配置分配容器。这意味着,如果纱线配置为每个容器分配最大2GB的内存,Spark请求一个具有3GB内存的容器,则作业将停止或停止,因为纱线无法满足Spark的请求

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

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

在warn site.xml上[在两个节点中]

纱线.节点管理器.资源.内存mb
:10240

纱线.节点管理器.资源.cpu vcores
:5

纱线.调度程序.最大分配mb
:2049

warn.scheduler.maximum allocation vcores
:1

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

火花配置

spark.driver.memory
1536mb

spark.warn.executor.memoryOverhead
512mb

spark.executor.memory
1536mb

spark.warn.executor.memoryOverhead
512mb

spark.driver.cores
1

spark.executor.cores
1

spark.executor.instances
19


请随意使用这些配置以满足您的需要。

尝试使用更高的执行器内存启动Pyspark会话“Pyspark--master Thread--驱动程序内存2g--执行器内存4g”我会试试。这和纱线容器的尺寸有什么关系?执行器在纱线容器中运行。通过定义executor内存来定义容器大小。没有开销内存大小?@Rags我认为这是错误的。执行器尺寸不一定是纱线容器的尺寸。谢谢@code。现在,我很想知道更多关于属性
warn.scheduler.maximum allocation mb
warn.scheduler.minimum allocation mb
的信息。为什么不总是让
warn.scheduler.maximum allocation mb
warn.nodemanager.resource.memory mb
一样大,并让
warn scheduler.minimum allocation mb
尽可能小?这样,通过最大值,您总是有足够的空间来支持执行器,并且您总是有足够的粒度来支持不超过最小值所需的内存。最后:我们不需要为操作系统等节省空间,所以我们应该将
warn.nodemanager.resource.memory mb
设置为小于10G的值,比如说8192 GB?您可以使
纱线.调度程序.最大分配mb
纱线.节点管理器.资源.内存mb
一样大,并使
纱线调度程序.最小分配mb
尽可能小。因为斯帕克是我喜欢的人
yarn.scheduler.maximum-allocation-mb = 10240
yarn.nodemanager.resource.memory-mb = 10240
spark.yarn.executor.memoryOverhead=2048
spark.driver.memory=3g