为什么Spark作业因"打开的文件太多"而失败?

sam*_*est 26 apache-spark

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

sam*_*est 23

这已在spark用户列表中得到解答:

最好的方法绝对只是增加ulimit,如果可能的话,这是我们在Spark中做出的一种假设,即群集将能够移动它.

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

通常,如果群集中的节点具有C分配的核心,并且您使用X reducer运行作业,则Spark将并行打开C*X文件并开始编写.随机合并将有助于减少创建的文件总数,但随时打开的文件句柄数不会改变,因此无法解决ulimit问题.

-Patrick Wendell


Dav*_*vid 12

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

使用

ulimit -a
Run Code Online (Sandbox Code Playgroud)

查看当前打开文件的最大数量

ulimit -n
Run Code Online (Sandbox Code Playgroud)

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

/etc/sysctl.conf
/etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)