• 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_

     
  • 相关阅读:
    [算法专题] 深度优先搜索&回溯剪枝
    [算法专题] 二分搜索&排序数组
    rand_1tom 产生 rand_1ton
    [LeetCode] Kth Largest Element in an Array
    进程控制(Note for apue and csapp)
    Transport Layer Protocols
    Internetworking
    Dynamic Programming | Set 4 (Longest Common Subsequence)
    Dynamic Programming | Set 3 (Longest Increasing Subsequence)
    Dynamic Programming | Set 2 (Optimal Substructure Property)
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/6183504.html
Copyright © 2020-2023  润新知