FAQ: org.apache.hadoop.hdfs.protocol.FSLimitException$MaxDirectoryItemsExceededException

问题描述/异常栈

diagnostics: User class threw exception: org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.FSLimitException$MaxDirectoryItemsExceededException): The directory item limit of /tmp/hive/dfc is exceeded: limit=1048576 items=1048576

解决方案

1. 将异常栈中提示目录重命名后,新建一个同名目录并修改权限与之前相同;
2. 调整NN配置参数`dfs.namenode.fs-limits.max-directory-items`参数,该参数上限值可调整为6400000

问题原因

产生该问题原因为:HDFS目录下的子目录/文件数量达到上限,默认值为1048576 已知触发场景有:
1. 每次执行HiveQL时,都会在`hive.exec.scratchdir`配置的目录下生成一个临时目录,任务执行结束后自动删除,但任务异常中断可能会导致删除失败;
2. SparkHistory数据存储在HDFS上,默认不会自定删除,也有可能达到文件数上限;

作者:焦巍