Hadoop出现Too many open files问题,可能的诱因有哪些?
Too many open files异常的可能原因 结合你提供的异常日志(读取HDFS块时触发FileNotFoundException并提示Too many open files),下面是几个常见的引发该问题的原因:
系统级文件句柄上限过低:Linux系统默认对每个进程的文件句柄限制(可通过
ulimit -n查看)通常比较保守(比如1024或4096)。Hadoop DataNode进程需要同时处理大量块文件的读写请求,当集群并发量高时,很容易超出这个限制。另外还要注意系统全局的文件句柄限制(/proc/sys/fs/file-max),如果全局上限不足,也会导致所有进程的可用句柄被耗尽。Hadoop进程的句柄配置不足:Hadoop自身的参数配置没有适配集群规模,比如:
hdfs-site.xml中的dfs.datanode.max.transfer.threads参数,控制DataNode同时处理的读写线程数,设置过小会导致线程排队,间接增加文件句柄的占用时间;- 开启短读短路(
dfs.client.read.shortcircuit=true)时,dfs.client.read.shortcircuit.streams.cache.size如果设置不合理,会导致客户端缓存大量未释放的文件句柄; - YARN容器的句柄限制(通过
yarn.nodemanager.resource.per-container.file-handles配置)过低,会导致运行在容器内的作业进程触发句柄上限。
应用程序的资源泄漏:MapReduce、Spark等上层作业在读写HDFS时,没有正确关闭
FSDataInputStream、FSDataOutputStream等IO流对象,导致文件句柄被持续占用。随着作业运行时间延长或并发任务增多,未释放的句柄会累积到触发系统限制。DataNode块目录结构不合理:如果DataNode的数据目录下的子目录层级过少(比如
dfs.datanode.numblocks设置过大,导致单个子目录下的块文件数量过多),当并发访问这些目录下的块文件时,需要打开的文件句柄数会急剧增加,容易超出进程的句柄上限。第三方进程抢占句柄资源:集群上运行的监控工具、日志收集工具(如Flume)、备份工具等后台进程,可能占用了大量系统文件句柄,导致留给Hadoop核心进程(DataNode、NameNode等)的可用句柄不足。
内容的提问来源于stack exchange,提问作者blangulin

