为什么Spark工作失败了"太多的打开文件"?

时间:2014-09-07 06:17:37

标签: apache-spark

我得到了太多的打开文件"在我的Spark工作的洗牌阶段。为什么我的工作开了这么多文件?我可以采取哪些措施来使我的工作取得成功。

3 个答案:

答案 0 :(得分:23)

This has been answered on the spark user list

  

最好的办法绝对只是增加ulimit,如果可能的话,   这是我们在Spark中假设群集的假设   能够移动它。

     

你可以通过减少数量来解决这个问题   reducer [或每个节点使用的核心]但这可能会对您的性能产​​生一些影响   工作。

     

通常,如果群集中的节点具有C分配的核心并且您运行   使用X redurs的作业然后Spark将并行打开C * X文件   动笔。随机合并将有助于减少总数   已创建的文件数,但文件句柄数在任何位置打开   时间不会改变,所以它无助于ulimit问题。

     

-Patrick Wendell

答案 1 :(得分:10)

默认的ulimit是1024,对于大型应用程序来说这是非常低的。 HBase推荐高达64K;现代linux系统似乎没有这么多打开文件的麻烦。

使用

ulimit -a

查看当前最大打开文件数

ulimit -n

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

中找到
/etc/sysctl.conf
/etc/security/limits.conf

答案 2 :(得分:1)

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

检查你是否有很多分区:

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()