1.现有quota的设置与使用
1.setQuota客户端到NN的主要流程
setQuota的shell入口示例如下:
|
|
该shell的执行过程从Client到NN的主要流程如下
——1.DFSAdmin$SetSpaceQuotaCommand#run
——2.DistributedFileSystem#setQuota
——3.DFSClient#setQuota
对应的NN端:
——4.FSNamesystem#setQuota
——5.FSDirAttrOp#unprotectedSetQuota
|
|
——6.INodeDirectory#setQuota
|
|
DirectoryWithQuotaFeature特性分为两种:quota数值和使用量:
- private QuotaCounts quota;
- private QuotaCounts usage;
在设置quota时,直接向客户端传入的long型的数值设置到Feature中。
因此在quota由物理改为逻辑时,setQuota部分无需更改。
quota会落地到fsimage,usage每次加载时动态计算,usage的值的计算逻辑需要更改。
2.count -q / -u 查看quota
hadoop fs -count -q 或 hadoop fs -count -u 命令客户端代码如下:
|
|
这里会走两个方法:
- src.fs.getQuotaUsage(src.path): 只查看 QUOTA REM_QUOTA SPACE_QUOTA REM_SPACE_QUOTA(物理空间)四个与设置quota有关时使用该方法
- src.fs.getContentSummary(src.path): 除了上述还会额外显示 DIR_COUNT FILE_COUNT CONTENT_SIZE(已用逻辑空间)
主要计算逻辑直接对应到NN端同名方法。
注意:getQuotaUsage和getContentSummary会走不同的方法:
- getQuotaUsage:直接取DirectoryWithQuotaFeature中的usage字段,该值是一个缓存值,启动后放在内存中。NN启动时会计算所有子目录求和所得。
- getContentSummary:每次重新计算
2.quota在hadoop中的限制作用
超过quota限制时,NameNode端会返回DSQuotaExceededException异常,如下:
|
|
搜索该异常的全部调用方如下
——1.DirectoryWithQuotaFeature
- DirectoryWithQuotaFeature#verifyNamespaceQuota
- DirectoryWithQuotaFeature#verifyStoragespaceQuota
——2.DFSOutputStream
- DFSOutputStream#addBlock
- dfsClient.namenode.addBlock
- DFSOutputStream#newStreamForCreate
- dfsClient.namenode.create
——3.DFSClient
DFSClient直接调用NameNode对应的方法,如下
- DFSClient#createSymlink
- namenode.createSymlink
- DFSClient#callAppend
- DFSOutputStream.newStreamForAppend
- DFSClient#setReplication
- namenode.setReplication
- DFSClient#rename
- namenode.rename
- namenode.rename2
- DFSClient#primitiveMkdir
- namenode.mkdirs
- DFSClient#setQuota
- namenode.setQuota
可知,NN在以下情况会做quota校验:
- create
- append
- setReplication
- rename
- mkdirs
- setQuota
其中校验方法为:
- DirectoryWithQuotaFeature#verifyNamespaceQuota
- DirectoryWithQuotaFeature#verifyStoragespaceQuota
|
|
以addBlock为例:
|
|
|
|
FSDirectory#updateCount
|
|
其他方法类似不再赘述。
2.SpaceQuota改逻辑空间
1.改动
主要是两方面改动:
-
create/mv/setrep等操作时,会判断存储增量(delta),这里将原有的物理空间判断改为逻辑空间判断。其中更新quota的逻辑如下;
-
DirectoryWithQuotaFeature中的usage变量初始化逻辑由物理空间改为逻辑空间。
2.测试
以下为SpaceQuota改成逻辑空间的测试。
|
|
put
|
|
mv
|
|
setrep
|
|
du
|
|
rm
|
|
注意:由于重启nn后,quota中的usage会重新计算。在上一版本的测试中发现,重启nn后,使用hadoop fs -count - u查看的剩余量不准(按物理空间量算了)。所以这一部分必须测试。
重启后查看
|
|
cp
|
|
子目录测试
|
|
EC测试
|
|
进一步测试
需要对副本、EC文件,小于、等于、大于一个块(块组)的情况进一步测试。
4.可能的问题
1.fsimage中字段无需改动
2.历史quota需要全部找到,在升级版本后,刷成逻辑空间
3.namequota与spacequota的比例
4.quota会按磁盘的type来做精细化限制,内部版本不作考虑。