Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /mydir is exceeded: quota=100000 file count=100001


  • 集群中遇到了文件個數超出限制的錯誤:

0)昨天晚上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設置了限制,但是設置限制的目的是避免集群中有過多的小文件,導致集群利用率不高的情況出現。

我這個spark job主要處理的任務內容:

var conf=new SparkConf().setAppName("test_job")
var sc=new SparkContext(conf)
var hiveContext=new HiveContext(sc)

import hiveContext.implicits._

hiveContext.sql("insert into member_info select t10.*,t11.* from member as t10 inner join member_details as t11 on t10.id=t11.memberid");
  • 關於hadoop quota的信息:

hadoop HDFS有以下兩種Quota

Name Quotas : 限制某個目錄下的文件數量
Space Quotas : 設置某個目錄的空間大小

$hadoop fs -count -q /user/hadoop QUOTA REMAINING_QUOTA SPACE_QUOTA REMAINING_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME none inf none inf 2 1 180 /user/hadoop

清除Space Quota

$hadoop dfsadmin -clrSpaceQuota /user/hadoop

設置Name Quota

設置文件最大quota是1000

$hadoop dfsadmin -setQuota 1000 /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

清除Name Quota

$hadoop dfsadmin -clrQuato /user/hadoop
  • 如何避免集群中過多小文件出現的方法:

hive下可以通過以下幾點去限制:
1)文件合並
 

 set hive.merge.mapredfiles = true #在Map-Reduce的任務結束時合並小文件
 set hive.merge.size.per.task = 128000000 #合並文件的大小
 set hive.merge.smallfiles.avgsize=128000000 #當輸出文件的平均大小小於該值時,啟動一個獨立的map-reduce任務進行文件merge

2)Map輸入合並小文件

  set mapred.max.split.size=256000000;  #每個Map最大輸入大小
  set mapred.min.split.size.per.node=100000000; #一個節點上split的至少的大小
  set mapred.min.split.size.per.rack=100000000; #一個交換機下split的至少的大小
  set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #執行Map前進行小文件合並

3)輸出合並

  set hive.merge.mapfiles = true #在Map-only的任務結束時合並小文件
  set hive.merge.mapredfiles = true #在Map-Reduce的任務結束時合並小文件
  set hive.merge.size.per.task = 256000000 #合並文件的大小
  set hive.merge.smallfiles.avgsize=256000000 #當輸出文件的平均大小小於該值時,啟動一個獨立的map-reduce任務進行文件merge

 

spark job下可以這么設置
//重分區,減少文件數
val trade_company_df_save=trade_company_df.repartition(1)
trade_company_df_save.registerTempTable("trade_company_df");

  •  參考文章:

http://nlslzf.iteye.com/blog/1617239
http://wenku.baidu.com/link?url=6dxklmJNF6XTFot4zlzt-_d_UXTcoPQzuATtnQil7M9My_3g_0NYJ5mx4K7tEj1jwq6KywUoBWvgPBbMkz9s7TSfCmYT_xLNZAuZRFWk36_

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM