說明:hadoop2.7和3.2均有測試,spaceQuota是物理空間!
說明
關於hdfs quota,參見2篇博客的講解。
- https://blog.csdn.net/qq_28069577/article/details/90262992
- 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
的空間,否則再小的文件也傳不了。
總結:
- 對於3副本,必須要要留有3個塊的大小即128M*3=384M的空間,才能上傳文件。
- 實際佔用大小是文件自己的大小。