Hadoop集群中遇到了文件个数超出限制的错误解决办法

昨天晚上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

如何避免集群中过多小文件出现的方法:

  1. 文件合并
  2. Map输入合并小文件
  3. 输出合并
  4. spark job下可以这么设置: 重分区,减少文件数(例如data_rdd.coalesce(50).saveAsTextFile(sys.argv[2], compressionCodecClass='org.apache.hadoop.io.compress.GzipCodec')
参考
  1. https://www.cnblogs.com/yy3b2007com/p/6183504.html
  2. https://blog.csdn.net/picway/article/details/80373078

猜你喜欢

转载自blog.csdn.net/qq_36653505/article/details/86031317