我得到了太多的打开文件"在我的Spark工作的洗牌阶段。为什么我的工作开了这么多文件?我可以采取哪些措施来使我的工作取得成功。
答案 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()