hdfs quota(SapceQuota是物理空間)


說明:hadoop2.7和3.2均有測試,spaceQuota是物理空間!

說明

關於hdfs quota,參見2篇博客的講解。

  1. https://blog.csdn.net/qq_28069577/article/details/90262992
  2. https://blog.csdn.net/picway/article/details/80373078

測試

對於測試,以本文爲準
查看塊和副本:

[hadoop@hadoop1 test]$ hadoop fs -stat "%o %r"  /quota/128m_2
134217728 3

可知,塊爲128M的集羣。
設10個nameQuota和1024M的spaceQuota,注意:這裏的spaceQuota是物理空間!你申請的是物理空間!

hadoop fs -mkdir /quota
dd if=/dev/zero of=128m bs=1M  count=128

# 設置quota 10 和 1024M
hadoop dfsadmin -setQuota 10 /quota
hadoop dfsadmin -setSpaceQuota 1024m /quota

# 初始查看
hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf             1 G             1 G            1            0                  0 /quota

# 上傳一個128M塊
hdfs dfs -copyFromLocal 128m /quota/128m_1

# 查看,可知nameQuota佔2個,原因是一個目錄,一個文件。
# spaceQuota居然剩餘640M,原因是三副本,128*3=384M。1024-384M=640M
hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
          10               8             1 G           640 M            1            1              128 M /quota

# 再上傳一個128M的文件
hdfs dfs -copyFromLocal 128m /quota/128m_2

# 再查看,可知nameQuota佔用兩文件一目錄,還剩7個。
# spaceQuota佔用128*2*3=768M,還剩256M
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
          10               7             1 G           256 M            1            2              256 M /quota

# 上傳第三個文件時報錯
[hadoop@hadoop1 test]$ hdfs dfs -copyFromLocal 128m /quota/128m_3
copyFromLocal: The DiskSpace quota of /quota is exceeded: quota = 1073741824 B = 1 GB but diskspace consumed = 1207959552 B = 1.13 GB

可知,申請1024M的空間,只能放128M的文件2個,因爲兩個128M的邏輯空間有256M,物理空間已經是768M了!


1.小文件測試

當上傳10M後,是佔用128M還是10M呢?答案是10M。

hadoop fs -copyFromLocal 10m /quota/10m_1
[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota/10m_1
# 1024M,上傳10M後,佔用30M
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
          10               8             1 G           994 M            1            1               10 M /quota
2.設小塊

測試1:設置50M的quota

hadoop fs -mkdir /quota50
# 設50M
hadoop dfsadmin -setSpaceQuota 50m /quota50
# 查看quota
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota50
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf            50 M            50 M            1            0                  0 /quota50
# 上傳10M,上傳不了
[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota50/10m_1
copyFromLocal: The DiskSpace quota of /quota50 is exceeded: quota = 52428800 B = 50 MB but diskspace consumed = 402653184 B = 384 MB

可以看到,即使設置50M的quota,上傳一個文件,也是不能上傳的。10M的文件也要佔用128的空間,需要3個塊,所以需要128*3M=384M的空間。

測試2:我們設置200M的quota

hadoop fs -mkdir /quota200
hadoop dfsadmin -setSpaceQuota 200m /quota200

# 查看quota
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota200
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf           200 M           200 M            1            0                  0 /quota200

200M是128M+72M。我們上傳一個10M的,仍然上傳不了。仍然需要384M的空間。

[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota200/10m_1
copyFromLocal: The DiskSpace quota of /quota200 is exceeded: quota = 209715200 B = 200 MB but diskspace consumed = 402653184 B = 384 MB

測試3:那麼,我們建400M的quota,能否傳兩個10M呢?

[hadoop@hadoop1 test]$ hadoop fs -mkdir /quota400
[hadoop@hadoop1 test]$ hadoop dfsadmin -setSpaceQuota 400m /quota400

# 查看quota
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota400
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf           400 M           400 M            1            0                  0 /quota400

# 上傳10M
[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota400/10m_1

# 查看quota
[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota400
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf           400 M           370 M            1            1               10 M /quota400

# 看到第一次上傳10M,佔用了30M,剩餘370M

# 第二次上傳失敗!
[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota400/10m_2
copyFromLocal: The DiskSpace quota of /quota400 is exceeded: quota = 419430400 B = 400 MB but diskspace consumed = 434110464 B = 414 MB

結論:設置quota一定要設置塊大小(128M)的倍數!

測試4:1024M的quota可以分8個block塊,那麼上傳10M的文件,能上傳多少個呢?
是不是一個10M佔3個塊,最多傳2個10M(第三個就是9個塊)呢,答案:不是的。
上傳15個10M後,查看quota:

[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf             1 G           574 M            1           15              150 M /quota

上傳22個文件後,查看quota:

[hadoop@hadoop1 test]$ hadoop fs -count -q -v -h /quota
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
        none             inf             1 G           364 M            1           22              220 M /quota

上傳第23個時,出錯:

[hadoop@hadoop1 test]$ hadoop fs -copyFromLocal 10m /quota/10m_23
copyFromLocal: The DiskSpace quota of /quota is exceeded: quota = 1073741824 B = 1 GB but diskspace consumed = 1094713344 B = 1.02 GB

可以分析出,最後一個文件,必須要先留有128*3=384M的空間,但是實際佔用是文件自己的大小。設置quota最小爲128*3=384M的空間,否則再小的文件也傳不了。

總結

  1. 對於3副本,必須要要留有3個塊的大小即128M*3=384M的空間,才能上傳文件。
  2. 實際佔用大小是文件自己的大小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章