说明: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的空间,才能上传文件。
- 实际占用大小是文件自己的大小。