在我的Spark工作的混洗阶段,我得到了“太多打开的文件”。为什么我的工作要打开这么多文件?我可以采取哪些步骤来尝试使我的工作成功。
发布于 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
发布于 2014-09-09 00:00:26
默认的ulimit是1024,对于大规模应用程序来说,这个值低得离谱。HBase建议使用64K大小的文件;现代的linux系统在处理这么多打开的文件时似乎没有问题。
使用
ulimit -a要查看当前打开的最大文件数,请执行以下操作
ulimit -n可以临时更改打开的文件数;您需要更新系统配置文件和每个用户的限制才能使其永久生效。在CentOS和RedHat系统上,可以在
/etc/sysctl.conf
/etc/security/limits.conf发布于 2018-04-20 22:00:01
这个错误的另一个解决方案是减少分区。
使用以下命令检查您是否有很多分区:
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()https://stackoverflow.com/questions/25707629
复制相似问题