我是靠谱客的博主 烂漫煎饼,最近开发中收集的这篇文章主要介绍只有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整形对应的位置上。

最后

以上就是烂漫煎饼为你收集整理的只有64位,如何存下hadoop的权限信息?-2的全部内容,希望文章能够帮你解决只有64位,如何存下hadoop的权限信息?-2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部