昨天晚上spark 任务突然抛出了异常:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /mydir is exceeded: quota=100000 file count=100001
1)错误提示内容信息:集群中遇到了文件个数超出限制的错误。
2)问题错误来自于hadoop quota设置了限制,但是设置限制的目的是避免集群中有过多的小文件,导致集群利用率不高的情况出现。
关于hadoop quota的信息:
hadoop HDFS有以下两种Quota
- Name Quotas : 限制某个目录下的文件数量
- Space Quotas : 设置某个目录的空间大小
查看HDFS目录的Quota信息
$hadoop fs -count -q /user/hadoop
设置Name Quota
$hadoop dfsadmin -clrQuato /user/hadoop
(这个需要超级用户的权限)
$hadoop fs -count -q /user/hadoop
QUOTA REMAINING_QUOTA SPACE_QUOTA REMAINING_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME
1000 997 1073741824 1073741284 2 1 180 /user/hadoop
如何避免集群中过多小文件出现的方法:
- 文件合并
- Map输入合并小文件
- 输出合并
- spark job下可以这么设置: 重分区,减少文件数(例如
data_rdd.coalesce(50).saveAsTextFile(sys.argv[2], compressionCodecClass='org.apache.hadoop.io.compress.GzipCodec')
)