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