说明
使用超级用户可以代表其他用户的行为
使用案例
比如说一个“super”的超级用户希望代表用户"joe"提交作业并访问hdfs,超级用户具有kerberos凭据,joe没有。
任务需要以joe的身份运行。
文件访问需要以joe的身份运行。
joe以super的凭据连接到namenode,就是说super模拟用户joe。
demo
spuer创建一个“joe”代理用户的udi,来提交任务,访问hdfs。
...
//Create ugi for joe. The login user is 'super'.
UserGroupInformation ugi =
UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
//Submit a job
JobClient jc = new JobClient(conf);
jc.submitJob(conf);
//OR access hdfs
FileSystem fs = FileSystem.get(conf);
fs.mkdir(someFilePath);
}
}
配置
可以通过配置hadoop.proxyuser. s u p e r u s e r . h o s t s 和 h a d o o p . p r o x y u s e r . superuser.hosts和hadoop.proxyuser. superuser.hosts和hadoop.proxyuser.superuser.groups /hadoop.proxyuser.$superuser.users.来定义可以超级用户可以代理哪些用户。
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>host1,host2</value>
</property>
<property>
<name>hadoop.proxyuser.super.groups</name>
<value>group1,group2</value>
</property>
也可以配置成*,下面的例子是oozie用户可以模拟所有的用户提交
<property>
<name>hadoop.proxyuser.oozie.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.oozie.groups</name>
<value>*</value>
</property>
host可以配置成ip,表示某一个ip范围内的访问的客户端可以模拟用户user1,user2
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>10.222.0.0/16,10.113.221.221</value>
</property>
<property>
<name>hadoop.proxyuser.super.users</name>
<value>user1,user2</value>
</property>
说明
- 如果是kerberos开启,superuser需要提供票据