设为首页 加入收藏

TOP

Hive多用户操作以及权限管理
2019-01-21 01:06:32 】 浏览:476
Tags:Hive 用户 操作 以及 权限 管理

Hive是基于Hadoop的一个数据仓库工具,是一种逻辑上的数据库,依赖hdfs文件系统;它把实际的数据文件映射为一张数据库表来作为元数据来管理hdfs上的数据。Hive存在的意义并非数据存储,而是被用来处理数据的,它计算的实质是用sql调用了底层的mapreduce。因为hive的sql的学习成本比较低,几乎和mysql这些数据库近似,所以使用极其广泛。很多公司使用hive几乎都能够撑起整个项目。

Hive几大组件

Driver组件:包括Complier、Optimizer和Excecutor,主要作用是将sql进行解析、编译优化、生成执行计划,然后调用底层的的mapreduce计算框架。

Thrift服务组件:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。

Metastore组件:它是元数据服务组件,hive元数据集中存放地。Metastore组件包括两个部分:metastore服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如mysql数据库。Metastore服务是建立在后台数据存储介质之上,并且可以和hive服务进行交互的服务组件,默认情况下,metastore服务和hive服务是安装在一起的,运行在同一个进程当中。也可以把metastore服务从hive服务里剥离出来,metastore独立安装在一个集群里,hive远程调用metastore服务,这样就可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的metastore服务,可以让metastore服务和hive服务运行在不同的进程里,这样也保证了hive的稳定性,提升了hive服务的效率。

客户端组件:包括cli命令行接口;Thrift客户端,实际上像jdbc、odbc这些接口都是建立在thrift客户端之上的;WEBGUI是hive客户端提供网页访问服务,这个接口对应了hive的hwi(hive web interface)组件,使用前要启动hwi服务。

Hive多用户操作配置

Hive-server配置(hive-site.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
39
40

<configuration>
<!--配置jdbc连接,ip为安装mysql的主机ip,database_name是给hive使用
的数据库名称-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.11.35/database_name
createDatabaseIfNotExist=true</value>
<description>JDBCconnectstringforaJDBCmetastore</description>
</property>

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>DriverclassnameforaJDBCmetastore</description>
</property>

<!--在mysql里给hive使用的mysql用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>usernametouseagainstmetastoredatabase</description>
</property>

<!--在mysql里给hive使用的mysql用户密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
<description>passwordtouseagainstmetastoredatabase</description>
</property>

<!--数据在hdfs上保存的路径-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse/user_name</value>
<description>basehdfspath:locationofdefaultdatabaseforthe
warehouse</description>
</property>

</configuration>

Hive-client配置(hive-site.xml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<configuration>

<!--配置hive-server的uri路径-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.11.35:9083</value>
<description>Thrifturifortheremotemetastore.Usedby
metastoreclienttoconnecttoremotemetastore.</description>
</property>

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse/zhangyi</value>
<description>locationofdefaultdatabaseforthewarehouse</description>
</property>

<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>

</configuration>

在hive-server上开启metastone监听:

1

$hive--servermetastore–p 9083

然后在hive-client上执行hive命令

Hive多用户权限控制

当多个用户共同使用hive时,需要对不同角色做不同的权限控制。权限控制主要指底层的hdfs文件操作控制和hive自身对表的授权管理。hive是通过mysql的元数据来控制hive里的权限。

Hive授权的核心是:user,group,role。

User:是基于linux用户的user,哪个linux用户使用hive客户端,那个linux用户就是该hive的user。

Group:同样是linux层面上的用户组。

Role:只有角色是在hive里面自己创建的,可以给角色添加权限属性,再把角色赋予给user,这样该用户就拥有了该角色的权限。

Hive多用户权限控制需要在客户端的hive-site.xml加上以下属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

18

19

20

21

22

<!--开启hive权限认证机制-->
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
<description>enableordisablethehiveclientauthorization</description>
</property>

<!--设置用户对自己创建的表拥有所有权限-->
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
<description>theprivilegesautomaticallygrantedtotheownerwhenever
atablegetscreated.Anexamplelike"select,drop"willgrantselect
anddropprivilegetotheownerofthetable</description>
</property>


<!--通常出现ThecurrentbuiltinauthorizationinHiveisincomplete
anddisabled.错误提示时配置下面的参数-->
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.
HiveAuthorizationTaskFactoryImpl</value>
</property>

此时hive已经开启了权限管理的功能,但是所有的用户都拥有给自己甚至别人赋权的能力。为了安全起见(这种安全机制只是为了避免误操作)我们只需要一个超级管理员用户拥有给别人赋权的能力。所以接着我们写一个类用来控制用户的赋权权限。

Vim AuthHook.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

packagecom.hivepro.test;

importorg.apache.hadoop.hive.ql.parse.ASTNode;
importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
importorg.apache.hadoop.hive.ql.parse.HiveParser;
importorg.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
importorg.apache.hadoop.hive.ql.parse.SemanticException;
importorg.apache.hadoop.hive.ql.session.SessionState;


publicclassAuthHookextendsAbstractSemanticAnalyzerHook{
privatestaticStringadmin="hadoop";

@Override
publicASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext,
ASTNodeast)throwsSemanticException{
switch(ast.getToken().getType()){
caseHiveParser.TOK_CREATEDATABASE:
caseHiveParser.TOK_DROPDATABASE:
caseHiveParser.TOK_CREATEROLE:
caseHiveParser.TOK_DROPROLE:
caseHiveParser.TOK_GRANT:
caseHiveParser.TOK_REVOKE:
caseHiveParser.TOK_GRANT_ROLE:
caseHiveParser.TOK_REVOKE_ROLE:
StringuserName=null;
if(SessionState.get()!=null
&&SessionState.get().getAuthenticator()!=null){
userName=SessionState.get().getAuthenticator().getUserName();
}
if(!admin.equalsIgnoreCase(userName)){
thrownewSemanticException(userName
+"can'tuseADMINoptions,except"+admin+".");
}
break;
default:
break;
}
returnast;
}
}

接着将该java文件编译、打包后放入hive的lib目录下并在hive-client的hive-site.xml添加属性

1
2
3
4
5

<!--配置超级管理员,需要自定义控制类继承这个AbstractSemanticAnalyzerHook-->
<property>
<name>hive.semantic.analyzer.hook</name>
<value> com.hivepro.test.AuthHook</value>
</property>

权限管理命令

创建角色:

1

createrolerole_name

显示所有的角色

1

Show roles

删除角色:

1

droprolerole_name

赋权给角色

1
2
3
4

<!--赋予role_name拥有在database_name创建的权限-->
grantcreateondatabasedatabase_nametorolerole_name
<!--赋予role_name拥有table_name查询的权限-->
grantselecton[table]table_nametorolerole_name

回收某个角色的某个权限

1
2

revokecreateondatabasedatabase_namefromrolerole_name
revokeselecton[table]table_namefromrolerole_name

查看某个角色在某张表或某个数据库的权限

1
2

showgrantrolerole_nameondatabasedatabase_name
showgrantrolerole_nameon[table]table_name

将角色赋予给用户

1

grantrolerole_nametouseruser_name

查看某用户的所有角色

1

showrolegrantuseruser_name

权限属性:

ALL

所有权限

ALTER

允许修改元数据(modify metadatadata of object)---表信息数据

UPDATE

允许修改物理数据(modify physicaldata of object)---实际数据

CREATE

允许进行Create操作

DROP

允许进行DROP操作

LOCK

当出现并发的使用允许用户进行LOCK和UNLOCK操作

SELECT

允许用户进行SELECT操作

SHOW_DATABASE

允许用户查看可用的数据库


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇实战Hive本地文件系统导入数据 下一篇Hive:客户端

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目