首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

HDFS quota 設订

2012-09-21 
HDFS quota 設定http://fenriswolf.me/2012/04/04/hdfs-quota-%E8%A8%AD%E5%AE%9A/?在多人共用的狀況下,qu

HDFS quota 設定

http://fenriswolf.me/2012/04/04/hdfs-quota-%E8%A8%AD%E5%AE%9A/

?

在多人共用的狀況下,quota 的設定非常重要。尤其是在 Hadoop 處理大量資料的環境,不小心就容易把所有的空間用完造成別人無法存取

Hadoop quota 的設定是針對目錄,而不是針對帳號。所以在管理上最好讓每個帳號只能寫入某一個目錄(例如 /user/fenriswolf),然後對各別目錄加上 quota 設定
設定方式有兩種

    Name Quotas : 等於 ulimit 裡的 hard limit,也就是設定某個目錄下檔案及目錄的總數Space Quotas : 設定某個目錄下使用的空間大小

    預設是沒有任何 quota 限制的,可以用?hadoop fs -count?來看

    1hadoop fs -count -q /user/fenriswolf

    ?

    以下是結果,none 及 inf 表示沒有設定

    1QUOTA??????????? REMAINING_QUOTA? SPACE_QUOTA????? REMAINING_SPACE_QUOTA? DIR_COUNT?? FILE_COUNT??? CONTENT_SIZE? FILE_NAME2none???????????? inf????????????? none???????????? inf??????????????????? 6?????????? 15??????????? 2598367?????? hdfs://localhost:9000/user/fenriswolf

    ?

    1. Name Quotas
    計算公式為
    QUOTA – (DIR_COUNT + FILE_COUNT) = REMAINING_QUOTA

    設定方式,這裡的 10000 是指 DIR_COUNT + FILE_COUNT = 10000
    最大值為 Long.Max_Value

    1hadoop dfsadmin -setQuota 10000 /user/fenriswolf/

    ?

    用?hadoop fs -count?來看現在的設定

    1QUOTA??????????? REMAINING_QUOTA? SPACE_QUOTA????? REMAINING_SPACE_QUOTA? DIR_COUNT?? FILE_COUNT??? CONTENT_SIZE? FILE_NAME210000??????????? 9000???????????? none???????????? inf??????????????????? 60????????? 940?????????? 45343100????? hdfs://localhost:9000/user/fenriswolf

    ?

    如果要寫入的檔案數已經超過設定值會看到下面的錯誤訊息

    1put: org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /user/fenriswolf is exceeded: quota=10000 file count=10001

    ?

    清除設定

    1hadoop dfsadmin -clrQuota /user/fenriswolf/

    ?

    2. Space Quotas
    計算公式為
    SPACE_QUOTA – CONTENT_SIZE = REMAINING_SPACE_QUOTA

    設定方式,這裡的 1g 是指 1GB,可用 m, g, t 來代表 MB, GB, TB

    1hadoop dfsadmin -setSpaceQuota 1g /user/fenriswolf/

    ?

    這裡要特別注意的是,space quota 的設定所看的不是上傳的檔案大小,是寫入 HDFS 的所有 block size
    假設一個檔案要寫入 2 個 blocks,在 core-site.xml 裡設定 dfs.block.size 為 64MB,dfs.replication 為 3
    那所需要的空間為 2 x 64MB x 3 = 384MB

    還有一件另人困擾的地方是,就算只存入一個小檔案,例如 1KB,實際寫入 HDFS 並不會占滿整個 block
    但 Hadoop 的 validation rule 仍然是用 1 x 64MB x 3 = 192MB 的方式去做計算

    用?hadoop fs -count?來看現在的設定

    1QUOTA??????????? REMAINING_QUOTA? SPACE_QUOTA????? REMAINING_SPACE_QUOTA? DIR_COUNT?? FILE_COUNT??? CONTENT_SIZE? FILE_NAME210000??????????? 9000???????????? 1073741824?????? 1028398724???????????? 60????????? 940?????????? 45343100????? hdfs://localhost:9000/user/fenriswolf

    ?

    如果要寫入的檔案數已經超過設定值會看到下面的錯誤訊息

    0112/03/19 05:44:51 ERROR hdfs.DFSClient: Exception closing file /user/fenriswolf/hive/lib/py/queryplan/ttypes.py : org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /user/fenriswolf is exceeded: quota=1073741824 diskspace consumed=1.5g02org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /user/fenriswolf is exceeded: quota=1073741824 diskspace consumed=1.5g03????at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)04????at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)05????at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)06????at java.lang.reflect.Constructor.newInstance(Constructor.java:513)07????at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:95)08????at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:57)09????at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:3558)10????at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:3421)11????at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2100(DFSClient.java:2627)12????at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2822)

    ?

    清除設定

    1hadoop dfsadmin -clrSpaceQuota /user/fenriswolf/

    ?

    4. 其他
    Quota 的設定是跟著目錄走的,目錄如果改名字設定依然會存在
    麻煩的是,設定之後如果超過限制,雖然檔案寫不進 HDFS,但是檔案名稱卻已經存在,只是 size 為 0。造成加大 quota 還要先把已存在的檔案砍掉才能再寫入
    另外如果設定的 quota 值小於該目錄既存的 Name Quotas 及 Space Quotas 並不會出錯
    例如

    1hadoop dfsadmin -setQuota 100 /user/fenriswolf

    ?

    只是從?hadoop fs -count?會看到 REMAINING_QUOTA 變負值,當然也就無法再寫資料進去

    1QUOTA??????????? REMAINING_QUOTA? SPACE_QUOTA????? REMAINING_SPACE_QUOTA? DIR_COUNT?? FILE_COUNT??? CONTENT_SIZE? FILE_NAME2100????????????? -900???????????? 1073741824?????? 1028398724???????????? 60????????? 940?????????? 45343100????? hdfs://localhost:9000/user/fenriswolf

    ?

    ?
    ?
    執行環境
    CentOS 6.2
    JDK 1.6.0_31
    Cloudera CDH3U3

    參考資料
    HDFS Quotas Guide

    <!--EndFragment-->

热点排行