/ 根据 ugi 信息获取当前用户的 Subject 实例72. currentUser.setuser // 将当前用户线程局部变量,当前线程副本中的值设置为根据 ugi 获取到的 Subject 实例73. 74.75. / 获取用户名称76. /77. public abstract String getUserName 78. 79. / 获取到一个用户所属的组(可能该用户属于多个组)的名称 80. / 81. public abstract String getGroupNames 82. 83. / 登录系统的方法实现,如果登录成功则返回登录用户的一些信息,包括用户、组相关信息 的一个实例 / 84. public static UserGroupInformation loginConfiguration conf throws LoginE xception 85. null if LOGIN_UGI null 86. LOGIN_UGI UnixUserGroupInformation.loginconf // 默认使用 Hadoop 实现 的 UnixUserGroupInformation 来进行登录 87. 88. return LOGIN_UGI 89. 90. 91. / 从 Hadoop 的配置 Configuration 类实例中读取 UserGroupInformation 的信息 / 92. public static UserGroupInformation readFromConfiguration conf throws IOE xception 93. try 94. return UnixUserGroupInformation.readFromConfconf UnixUserGroupInform ation.UGI_PROPERTY_NAME // 默认使用 UnixUserGroupInformation 实现类来读取 Hadoop 配置类实例,获取用户和组信息 95. catch LoginException e 96. new throw IOExceptionnew IOException.initCausee 97. 98. 99. 该类中使用到 javax.security.auth.Subject 类,该类的实例包含了一个实体的两种信息:一个是用来认证的身份信息,另一个与该用户安全相关的信息,例如许可证书。
UserGroupInformation 类实现了 org.apache.hadoop.io.Writable 接口,该接口是 Hadoop框架基于 DataInput 和 DataOutput 定义的一个序列化协议,实现该接口的类支持序列化操作。
org.apache.hadoop.io.Writable 接口定义如下所示:view plain 1. package org.apache.hadoop.io 2. 3. import java.io.DataOutput 4. import java.io.DataInput 5. import java.io.IOException 6. 7. public interface Writable 8. / 9. 将对象(this)的属性字段序列化到输出流 DataOuput out 中。
10. / 11. void writeDataOutput out throws IOException 12. 13. / 14. 从输入流 DataInput in 中读取属性字段信息,重组为(this)对象,这是一个反序列化 操作。
15. / 16. void readFieldsDataInput in throws IOException 17. 总结一下,UserGroupInformation 抽象类主要定义的操作如下:1、获取当前用户线程的用和组信息(UGI),通过 getCurrentUGI方法实现的;2、获取用户名和组名,分别通过抽象方法 getUserName和 getGroupNames方法实现的;3、根据 Hadoop 的配置类 Configuration 实例,登录系统后返回一个 UserGroupInformation类的实例,通过方法 loginConfiguration conf实现的;4、读取 Hadoop 的配置类 Configuration 实例,返回一个 UserGroupInformation 类的实例,通过方法 readFromConfiguration conf实现的。
UserGroupInformation 类定义了一个与文件系统相关的用户和组信息抽象的内容,Hadoop框架实现了一个基于 Unix 系统的用户和组信息的实现类 UnixUserGroupInformation,该类继承自 UserGroupInformation 抽象类。
从 UserGroupInformation 抽象类与其子类 UnixUserGroupInformation 的属性字段可以看出,抽象类所定义的功能信息重心在,描述一个登录以后获得的 UserGroupInformation 实例,而 UnixUserGroupInformation 类主要是侧重于登录前的信息的处理。
首先看一下UnixUserGroupInformation 类中定义的属性:view plain 1. public static final String DEFAULT_USERNAME quotDrWhoquot 2. public static final String DEFAULT_GROUP quotTardisquot 3. final static private HashMapltString UnixUserGroupInformationgt user2UGIMap new HashMapltString UnixUserGroupInformationgt 4. 5. private String userName 6. private String groupNames 7. 8. final private static String UGI_TECHNOLOGY quotSTRING_UGIquot前面两个是默认的 Unix 用户名 DEFAULT_USERNAME 和组名 DEFAULT_GROUP,另外其中用户名 userName 和组名 groupNames 是根据 UnixUserGroupInformation 类构造方法设置的,这样保证了即使无法得到用户和组的信息,也能够使用默认的值去填充,比较适合用于测试,快速定位到用户名和组名的设置处。
第二个属性 user2UGIMap 是一个lt用户名 用户和组信息实例gt的 Map,用来快速获取到用户和组的信息。
最后一个 UGI_TECHNOLOGY 定义读获取用户和组信息的方式,显然该类中默认使用从文本中读取字符串的方式来构造。
对于 UnixUserGroupInformation 类实例的构造,该类给出了四个方法:view plain 1. public UnixUserGroupInformation 2. 3. 4. public UnixUserGroupInformationString userName String groupNames 5. setUserGroupNamesuserName groupNames 6. 7. 8. / 9. 根据一个或多个包含了“用户名和组名”的字符串的来构造 UnixUserGroupInformation 实 例。
10. / 11. public UnixUserGroupInformationString ugi 12. null if uginull ugi.length lt 2 13. throw new IllegalArgumentException quotParameter does contain at least quot quotone user name and one group namequot 14. 15. 16. public static UnixUserGroupInformation createImmutableString ugi 17. return new UnixUserGroupInformationugi 18. public void readFieldsDataInput in throws IOException 19. throw new UnsupportedOperationException 20. 21. 22. 23. String groupNames new Stringugi.length-1 24. System.arraycopyugi 1 groupNames 0 groupNames.length 25. setUserGroupNamesugi0 groupNames 26. 该类实现了其抽象基类定义的两个抽象方法,用来获取用户名和组名,如下所示:view plain 1. public String getGroupNames 2. return groupNames 3. 4. 5. public String getUserName 6. return userName 7. UserGroupInformation 抽象类实现了 org.apache.hadoop.io.Writable 接口,并没有在其中实现序列化操作的两个方法,所以在其子类 UnixUserGroupInformationg 给出了实现,如下:view plain 1. / 2. 反序列化重组(this)对象 3. / 4. public void readFieldsDataInput in throws IOException 5. // 首先读取 UGI 类型,默认就是从文本读字符串的类型 6. String ugiType Text.readStringin 7. if UGI_TECHNOLOGY.equalsugiType 8. throw new IOExceptionquotExpect UGI prefix: quot UGI_TECHNOLOGY quot but re ceive a prefix: quot ugiType 9. 10. 11. // 从 DataInput in 流对象中读取用户和组的信息 12. userName Text.readStringin 13. int numOfGroups WritableUtils.readVIntin 14. groupNames new StringnumOfGroups 15. int for int i 0 i lt numOfGroups i 16. groupNamesi Text.readStringin 17. 18. 19. 20. / 21. 序列化(this)对象,写入到 DataOutput out 输出流中 22. / 23. public void writeDataOutput out throws IOException 24. // 将 UGI_TECHNOLOGY 写入到 DataOutput out 中,写入位置是字节流的最前面 25. Text.writeStringout UGI_TECHNOLOGY 26.
上一篇:
Linux操作系统源代码详细分析
下一篇:
电咖汽车入选2018独角兽企业榜百强 发布“天际”品牌将推高估值