Hadoop 框架是两个模型实现的有机整合,亦即Hadoop分布式文件系统(HDFS)与MapReduce并行编程模型,也就是说,Hadoop框架要能够提供的基本功能就是,在存储系统HDFS上进行MapReduce并行计算,所以,如果想要了解Hadoop框架的工作原理和运行机制,主要从这两个方面着手。
其实,Hadoop中MapReduce并行计算应该是在HDFS实现的,因此了解计算所基于HDFS应该是入口点,当对HDFS有了一定的了解,就能够知道这样一个并行计算平台能够提供哪些进行计算的基础要素。
当然,在了解HDFS之前,应该先熟悉一下Hadoop对文件系统FS是如何实现的,都提供了哪些操作。在org.apache.hadoop.fs包中,提供了文件系统的高层抽象(FileSystem类),基于该抽象的文件系统,可以来实现满足实际需要的文件系统实现类,例如用来在本地存储原生文件的文件系统(RawLocalFileSystem),例如一个文件系统之上可以存在其它一些类型的文件系统(基于校验和的文件系统ChecksumFileSystem类就是这样的,ChecksumFileSystem extends FilterFileSystem,FilterFileSystem是一个最基本的文件系统实现)。
我在阅读源代码的过程中,首先从与org.apache.hadoop.fs包中文件系统相关的其它包org.apache.hadoop.security开始。
org.apache.hadoop.security包中的一些类涉及到文件系统中用户的信息,例如用户权限等等。所以,为了能够深入了解文件系统和方便阅读源代码,就应该了解与文件系统相关的安全支持,实际上也就是位于Hadoop源代码中org.apache.hadoop.security包中实现。
下面org.apache.hadoop.security包中类的继承关系:
下面分别对其中关键类的源代码进行阅读分析:
Group类与User类
首先,org.apache.hadoop.security.Group类与org.apache.hadoop.security.User类都是一个实体类,表征一个属于HDFS文件系统中存在的一类实体,它们的定义非常相似,下面只拿出Group类来说明。
Group类表示一个组的概念实现,它实现了java.security.Principal接口,也就是说Group类表示一个用来容纳一些对象的实体,比如一个组中可以包含多个不同的用户,一个组中可以包含多种不同的权限,一个组中还可以包含多种授权的证书,等等。这个类比较容易,包含一个final修饰的组名称的字段,也就是说一个组一旦创建就不能修改组名称,Group类没有提供修改组名称的方法。新创建一个组的时候,需要指定组名称。该类中比较重要的是equals方法,用来比较某个Object对象(组对象)是够与该组(this)相互匹配。
UserGroupInformation抽象类
在Hadoop框架中,分布式文件系统框架HDFS具有一个用来存储用户和组信息的实现,它是通过一个位于org.apache.hadoop.security包中的UserGroupInformation抽象类来抽象这些信息的,如果对于特定的基于用户和组的操作系统,都可以继承自该抽象类,用来实现表示用户与组的一些信息的实体,及其一些简单的操作。
下面是抽象类的源代码:
该类中使用到javax.security.auth.Subject类,该类的实例包含了一个实体的两种信息:一个是用来认证的身份信息,另一个与该用户安全相关的信息,例如许可证书。
UserGroupInformation类实现了org.apache.hadoop.io.Writable接口,该接口是Hadoop框架基于DataInput和DataOutput定义的一个序列化协议,实现该接口的类支持序列化操作。org.apache.hadoop.io.Writable接口定义如下所示:
总结一下,UserGroupInformation抽象类主要定义的操作如下:
1、获取当前用户线程的用和组信息(UGI),通过getCurrentUGI()方法实现的;
2、获取用户名和组名,分别通过抽象方法getUserName()和getGroupNames()方法实现的;
3、根据Hadoop的配置类Configuration实例,登录系统后返回一个UserGroupInformation 类的实例,通过方法login(Configuration conf)实现的;
4、读取Hadoop的配置类Configuration实例,返回一个UserGroupInformation 类的实例,通过方法readFrom(Configuration conf)实现的。