首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spark using python: How to resolve Stage x包含一个非常大的任务(xxx KB)。建议的最大任务大小为100 KB

Spark using python: How to resolve Stage x包含一个非常大的任务(xxx KB)。建议的最大任务大小为100 KB
EN

Stack Overflow用户
提问于 2015-03-05 21:10:58
回答 3查看 49.6K关注 0票数 40

我刚刚创建了range(1,100000)的python列表。

使用SparkContext完成以下步骤:

代码语言:javascript
复制
a = sc.parallelize([i for i in range(1, 100000)])
b = sc.parallelize([i for i in range(1, 100000)])

c = a.zip(b)

>>> [(1, 1), (2, 2), -----]

sum  = sc.accumulator(0)

c.foreach(lambda (x, y): life.add((y-x)))

它会给出如下警告:

ARN TaskSetManager:阶段3包含一个非常大的任务(4644KB)。建议的最大任务大小为100 KB。

如何解决此警告?有没有办法处理大小?此外,它是否会影响大数据的时间复杂性?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-16 16:27:49

扩展@leo9r注释:考虑不使用python range,而使用sc.range https://spark.apache.org/docs/1.6.0/api/python/pyspark.html#pyspark.SparkContext.range

这样就避免了从你的驱动程序到执行器的巨大列表的转移。

当然,这类RDDs通常仅用于测试目的,因此您不希望广播它们。

票数 6
EN

Stack Overflow用户

发布于 2017-08-16 04:19:45

一般的想法是,PySpark创建的java进程数量与执行器的数量一样多,然后将数据发送到每个进程。如果进程太少,java堆空间就会出现内存瓶颈。

在您的例子中,具体的错误是您使用sc.parallelize([...])创建的RDD没有指定分区的数量(参数numSlices,请参阅docs)。并且RDD缺省为太小的多个分区(可能由单个分区构成)。

要解决此问题,只需指定所需的分区数量:

代码语言:javascript
复制
a = sc.parallelize([...], numSlices=1000)   # and likewise for b

当您指定越来越多的切片数量时,您将看到警告消息中所述的大小减小。增加切片的数量,直到您不再收到警告消息。例如,获取

代码语言:javascript
复制
Stage 0 contains a task of very large size (696 KB). The maximum recommended task size is 100 KB

意味着您需要指定更多的切片。

在处理内存问题时可能有用的另一个提示(但这与警告消息无关):默认情况下,每个executor可用的内存约为1 GB。您可以通过命令行指定更大的数量,例如使用--executor-memory 64G

票数 16
EN

Stack Overflow用户

发布于 2015-07-20 16:32:26

在任务传送过程中,Spark原生地传送每个变量的副本。对于较大的此类变量,您可能希望使用Broadcast Variables

如果您仍然面临大小问题,那么也许这个数据本身就应该是一个RDD

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28878654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档