首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Spark作业会因为“打开的文件太多”而失败?

为什么Spark作业会因为“打开的文件太多”而失败?
EN

Stack Overflow用户
提问于 2014-09-07 14:17:37
回答 3查看 25.9K关注 0票数 30

在我的Spark工作的混洗阶段,我得到了“太多打开的文件”。为什么我的工作要打开这么多文件?我可以采取哪些步骤来尝试使我的工作成功。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-07 14:17:37

This has been answered on the spark user list

如果可能的话,最好的方法肯定是增加ulimit,这是我们在

中所做的一个假设,即集群将能够移动它。

您可以通过减少每个节点使用的reducers或核心数量来解决此问题,但这可能会对您的作业产生一些性能影响。

通常,如果集群中的一个节点分配了C个核心,而您使用X个reducers运行一个作业,那么Spark将并行打开C*X文件并开始写入。混洗合并将有助于减少创建的文件总数,但是任何时候打开的文件句柄的数量都不会改变,因此它对ulimit问题没有帮助。

-Patrick Wendell

票数 28
EN

Stack Overflow用户

发布于 2014-09-09 00:00:26

默认的ulimit是1024,对于大规模应用程序来说,这个值低得离谱。HBase建议使用64K大小的文件;现代的linux系统在处理这么多打开的文件时似乎没有问题。

使用

代码语言:javascript
复制
ulimit -a

要查看当前打开的最大文件数,请执行以下操作

代码语言:javascript
复制
ulimit -n

可以临时更改打开的文件数;您需要更新系统配置文件和每个用户的限制才能使其永久生效。在CentOS和RedHat系统上,可以在

代码语言:javascript
复制
/etc/sysctl.conf
/etc/security/limits.conf
票数 13
EN

Stack Overflow用户

发布于 2018-04-20 22:00:01

这个错误的另一个解决方案是减少分区。

使用以下命令检查您是否有很多分区:

代码语言:javascript
复制
someBigSDF.rdd.getNumPartitions()

Out[]: 200

#if you need to persist the repartition, do it like this
someBigSDF = someBigSDF.repartition(20)

#if you just need it for one transformation/action, 
#you can do the repartition inline like this
someBigSDF.repartition(20).groupBy("SomeDt").agg(count("SomeQty")).orderBy("SomeDt").show()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25707629

复制
相关文章

相似问题

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