只有64位,如何存下hadoop的权限信息?-2

接着上文说,我们再来看一下user和group的存储方式,它们的存储方式是一样,因为都是字符串类型。而hadoop的存储设计是将其保留为数字格式。SerialNumberManager是一个单例模式的全局对象,其中保存了两个SerialNumberMap类型的属性,分别为usermap和groupmap。如下所示:

只有64位,如何存下hadoop的权限信息?-2

 

而SerialNumberMap的结构如下所示。

只有64位,如何存下hadoop的权限信息?-2

 

其中保存着两个主要的Map:t2i和i2t,顾名思义t2i就是通过string返回int,而i2t相反通过int返回string。举例,如下图所示。

只有64位,如何存下hadoop的权限信息?-2

 

根据以上数据结果,hadoop就可以很好的保存字符串与int的对应关系了。但是这个结构也存在一个问题,就是用户名不能重名。

有了以上结构,对于每一个用户或组信息,都可以返回一个自增的唯一序号。

而updatePermissionStatus结构中实际记录的就是这个唯一序号。

接下来我们看一下如何记录这个唯一序号的。首先需要找到MASK信息。我们以GROUP为例,根据下面的代码来看一下GROUP的MASK信息是什么。

只有64位,如何存下hadoop的权限信息?-2

 

根据计算GROUP的LENGTH为25,OFFSET为16。

第一步计算:-1L >>> 24,结果为:

00000000 00000000 00000000 00000000 00000001 11111111 11111111 11111111

第二步记算:-1L >>> 24 << 16,结果库:

00000000 00000000 00000001 11111111 11111111 11111111 00000000 00000000

所以以上1代表的位置即为group的存储位置。

了解了以上内容后我们继续看,假设我们要存的group的序号为5吧。我们看看最终是怎么存的,先看一下代码:

只有64位,如何存下hadoop的权限信息?-2

 

然后我们逐步计算一下:

首先要执行 5 & ~MASK | (5<<16)

1.MASK:

00000000 00000000 00000000 00010010 00010000 00100000 00000000 00000000

2.~MASK:

11111111 11111111 11111110 00000000 00000000 00000000 11111111 11111111

3.5&~MASK

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

4.bits

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101

5.bits<<16

00000000 00000000 00000000 00000000 00000000 00000101 00000000 00000000

最终结果

00000000 00000000 00000000 00000000 00000000 00000101 00000000 00000000

解释一下。首先mask取反再与上记录本身的意思为清空group位上以前的值,而bits<<offset的意思是将group对应序号的数值稳动到group所在的位置。而后的并操作就是根据group的序号,更新group存储位置上的值。

至此hadoop权限存储的奥秘就解开了。一句话来表示,就是读写执行权限沿用linux的777模式,而用户名和组名记录在程序内部的数据结构中,而这两类字符串分别记录其序号,并将序号记录在一个long整形对应的位置上。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值