HBase的用户机制和Hadoop的用户机制是一样的。但对刚接触的人来说,相当的隐蔽,启动HBase不用设置用户名、密码,连接HBase也不需要设置用户名、密码。但HBase(实质上是Hadoop)提供了默认的用户来执行操作。
- 超级用户
如果没有特意配置,那么HBase会选择启动HBase的系统用户作为超级用户。如果需要改变超级用户,可通过修改hbase-site.xml来配置,加入hbase.superuser。
<property>
<name>hbase.superuser</name>
<value>admin</value>
</property>
- 默认用户
默认用户也类似,在没有特意配置时,HBase会选择当前的系统用户作为HBase的用户,改变默认用户隐藏的比较深,我们从代码来看。
分析源码
在创建Connection时,会判断是否已经创建了用户,如果没有,会调用LoginContext的login()方法来创建。中间的调用就直接跳过了,想详细看的可以参照以下堆栈信息。
在login方法中,按顺序反射调用了LOGIN_METHOD(login())和COMMIT_METHOD(commit()),中间啰嗦的代码就...跳过了,抓住重点看:
public void login() throws LoginException {
...
try {
// 分别反射调用了login和commit方法
invokePriv(LOGIN_METHOD);
invokePriv(COMMIT_METHOD);
...
} catch (LoginException le) {
...
}
}
invokePriv方法是invoke方法的带权限执行,主要看invoke方法。在invoke方法中,遍历module stack中的元素,对里面的每个元素反射执行login和commit方法。Module Stack中有两个元素,UnixLoginModule和UserGroupInformation$HadoopLoginModule。实际执行的顺序就是:
- UnixLoginModule#login
- UserGroupInformation$HadoopLoginModule#login
- <