Hive权限控制.docx
- 文档编号:6578535
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:11
- 大小:19.83KB
Hive权限控制.docx
《Hive权限控制.docx》由会员分享,可在线阅读,更多相关《Hive权限控制.docx(11页珍藏版)》请在冰豆网上搜索。
Hive权限控制
Hive从0.10版本(包含0.10版本)以后可以通过元数据来控制权限,Hive-0.10之前的版本对权限的控制主要是通过Linux的用户和用户组来控制,不能对Hive表的CREATE、SELECT、DROP等操作进行控制,当然Hive基于元数据来控制权限也不是完全安全的,目的就是为了防止用户不小心做了不该做的操作。
在使用Hive的元数据配置权限之前必须现在hive-site.xml中配置两个参数,配置参数如下:
hive.security.authorization.enabled参数是开启权限验证,默认为false。
hive.security.authorization.createtable.owner.grants参数是指表的创建者对表拥有所有权限,例如创建一个表table1,这个用户对表table1拥有SELECT、DROP等操作。
还有个值是NULL,表示表的创建者无法访问该表,这个肯定是不合理的。
Hive授权的核心就是用户(User)、组(Group)、角色(Role),Hive中的角色和平常认知的角色是有区别的。
Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。
这里有个递归的概念,就是一个角色可以是一些角色的集合。
举个例子:
用户组
张三group_db1
李四group_db2
王五group_bothdb
有三个用户分别属于group_db1、group_db2、group_bothdb。
group_db1、group_db2、group_bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。
现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。
这样只要将role_db1赋给group_db1(或者该组的所有用户),将role_db2赋给group_db2,就可以是实现指定用户访问指定数据库。
最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予group_bothdb,则group_bothdb中的用户可以访问两个数据库。
用户和组使用的是Linux机器上的用户和组,而角色必须自己创建。
注意:
如果有一个属于组group1的用户jayliu,他通过cli连接到远程的Server上执行操作,而远程的Server上有一个用户jayliu属于group2组,则在权限控制中jayliu是对应的group2组的。
10.1.1创建和删除角色
Hive中的角色定义与关系型数据库中角色的定义类似,它是一种机制,给予那些没有适当权限的所有用户分配一定的权限。
下面介绍一下Hive中角色的应用。
1)角色的创建。
语法:
CREATEROLEROLE_NAME
创建一个role_test1角色,命令如下:
hive>createrolerole_test1;
OK
Timetaken:
0.106seconds
2)删除角色。
语法:
DROPROLEROLE_NAME
删除role_test1角色,命令如下:
hive>DROPROLErole_test1;
OK
Timetaken:
6.483seconds
10.1.2角色的授权和撤销
角色的授权(GRANT)就是给角色授予创建表、查询表等操作,撤销(REVOKE)反之。
语法如下:
GRANTROLErole_name[,role_name]...TOprincipal_specification[,principal_specification]...
REVOKEROLErole_name[,role_name]...FROMprincipal_specification[,principal_specification]...
principal_specification :
USERuser |GROUPgroup |ROLErole
看下面的实例。
1)把role_test1角色授权给jayliu用户,命令如下:
hive>grantrolerole_test1touserjayliu;
OK
Timetaken:
0.102seconds
2)查看jayliu用户被授权的角色,命令如下:
hive>SHOWROLEGRANTuserjayliu;
OK
rolename:
role_test1
rolename:
role_test1
Timetaken:
7.913seconds,Fetched:
2row(s)
3)取消jayliu用户的role_test1角色,操作命令如下:
hive>revokerolerole_test1fromuserjayliu;
OK
Timetaken:
0.189seconds
Hive支持的权限控制如下表10-8所示。
表10-8Hive权限控制
操作
解释
ALL
所有权限
ALTER
允许修改元数据(modifymetadatadataofobject)---表信息数据
UPDATE
允许修改物理数据(modifyphysicaldataofobject)---实际数据
CREATE
允许进行Create操作
DROP
允许进行DROP操作
INDEX
允许建索引(目前还没有实现)
LOCK
当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT
允许用户进行SELECT操作
SHOW_DATABASE
允许用户查看可用的数据库
看下面的实例。
1)把select权限授权给jayliu用户,命令如下:
hive>grantselectondatabasedefaulttouserjayliu;
OK
Timetaken:
0.188seconds
2)查看jayliu被授予那些操作权限,命令如下:
hive>showgrantuserjayliuondatabasedefault;
OK
databasedefault
principalNamejayliu
principalTypeUSER
privilegeSelect
grantTimeThuJul1118:
17:
39CST2013
grantorroot
Timetaken:
7.615seconds,Fetched:
7row(s)
3)收回jayliu的select权限,操作如下:
hive>revokeselectondatabasedefaultfromuserjayliu;
OK
Timetaken:
0.147seconds
4)查看jayliu用户拥有那些权限:
hive>showgrantuserjayliuondatabasedefault;
OK
Timetaken:
0.032seconds
10.1.3超级管理员权限
Hive本身有权限管理功能,需要通过配置开启。
配置文件内容如下:
其中hive.security.authorization.createtable.owner.grants设置成ALL表示用户对自己创建的表是有所有权限。
开启权限控制有Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。
Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员”,必须添加hive.semantic.analyzer.hook配置,并实现自己的权限控制类。
实现“超级管理员”的步骤如下。
1)编写编写权限控制类,代码如代码清单10-4所示。
代码清单10-4hive\udaf\AvgUDAF.java
packagecom.autoNavi.hive;
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;
publicclassHiveAdminextendsAbstractSemanticAnalyzerHook{
privatestaticStringadmin="admin";
@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;
}
}
2)添加控制类HiveAdmin到Hive的配置文件(hive-site.xml)中,代码如下所示:
添加了配置文件以后,如果启动了HiveServer,必须关闭重启功能才能生效。
至此,只有admin用户可以进行Grant/Revoke操作。
例如,jayliu用户启动Hive的Shell命令,把default数据库中的所有表的查询(SELECT)授权给用户hadoop,命令如下:
hive>GRANTSELECTONDATABASEdefaultTOUSERhadoop;
FAILED:
SemanticExceptionjayliucan'tuseADMINoptions,exceptadmin.
Hive的权限控制在Hive的生产环境中使用的非常多,在0.10版本之前Hive是没有提供这个功能的。
读者使用这个功能的时候一定要确保Hive的版本在0.10以后。
10.2实例:
使用JDBC开发Hive程序
在使用JDBC开发Hive程序时,必须首先开启Hive的远程服务接口。
使用下面命令进行开启:
hive--servicehiveserver&
10.2.1准备测试数据
准备一个文件hiveJDBC.txt,文件内容(每行数据之间用tab键隔开)为:
1hadoop
2hive
3Hbase
数据准备好了,接下来使用Hive的JDBC来实现对Hive表的数据加载、表结构信息和数据查询等操作。
10.2.2代码实现
Hive的JDBC操作实现表的数据加载、表结构信息和数据查询。
代码如代码清单10-3所示。
代码清单10-3hive\udaf\HiveJdbcClient.java
packagecom.hive.jdbc;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importorg.apache.log4j.Logger;
publicclassHiveJdbcClient{
privatestaticStringdriverName="org.apache.hadoop.hive.jdbc.HiveDriver";
privatestaticStringurl="jdbc:
hive:
//192.168.153.100:
10000/default";
privatestaticStringuser="hive";
privatestaticStringpassword="hive";
privatestaticStringsql="";
privatestaticResultSetres;
privatestaticfinalLoggerlog=Logger.getLogger(HiveJdbcClient.class);
publicstaticvoidmain(String[]args){
try{
Class.forName(driverName);
Connectionconn=DriverManager.getConnection(url,user,password);
Statementstmt=conn.createStatement();
//创建的表名
StringtableName="testHiveJDBC";
/**第一步:
存在就先删除**/
sql="droptable"+tableName;
stmt.executeQuery(sql);
/**第二步:
不存在就创建**/
sql="createtable"+tableName+"(keyint,valuestring)
rowformatdelimitedfieldsterminatedby'\t'";
stmt.executeQuery(sql);
//执行“showtables”操作
sql="showtables'"+tableName+"'";
System.out.println("Running:
"+sql);
res=stmt.executeQuery(sql);
System.out.println("执行“showtables”运行结果:
");
if(res.next()){
System.out.println(res.getString
(1));
}
//执行“describetable”操作
sql="describe"+tableName;
System.out.println("Running:
"+sql);
res=stmt.executeQuery(sql);
System.out.println("执行“describetable”运行结果:
");
while(res.next()){
System.out.println(res.getString
(1)+"\t"+res.getString
(2));
}
//执行“loaddataintotable”操作
Stringfilepath="/home/hadoop/ziliao/userinfo.txt";
sql="loaddatalocalinpath'"+filepath+"'intotable"+tableName;
System.out.println("Running:
"+sql);
res=stmt.executeQuery(sql);
//执行“select*query”操作
sql="select*from"+tableName;
System.out.println("Running:
"+sql);
res=stmt.executeQuery(sql);
System.out.println("执行“select*query”运行结果:
");
while(res.next()){
System.out.println(res.getInt
(1)+"\t"+res.getString
(2));
}
//执行“regularhivequery”操作
sql="selectcount
(1)from"+tableName;
System.out.println("Running:
"+sql);
res=stmt.executeQuery(sql);
System.out.println("执行“regularhivequery”运行结果:
");
while(res.next()){
System.out.println(res.getString
(1));
}
conn.close();
conn=null;
}catch(ClassNotFoundExceptione){
e.printStackTrace();
log.error(driverName+"notfound!
",e);
System.exit
(1);
}catch(SQLExceptione){
e.printStackTrace();
log.error("Connectionerror!
",e);
System.exit
(1);
}
}
}
代码实现完成,接下来运行这个代码,操作为RunAS->JavaAplication,Eclipse的控制台会出现如下结果:
Running:
showtables'testHiveJDBC'
执行“showtables”运行结果:
'testHiveJDBC'
Running:
describe'testHiveJDBC'
执行“describetable”运行结果:
keyint
valuestring
Running:
loaddatalocalinpath'/user/hadoop/hive/hiveJDBC.txt'intotabletestHiveJDBC
Running:
select*from'testHiveJDBC'
执行“select*query”运行结果:
hadoop
hive
hbase
Running:
selectcount
(1)fromtestHiveJDBC
执行“regularhivequery”运行结果:
Hive的JDBC接口在实际开发中是经常用到的。
和MySQL的JDBC接口非常的类似。
给开发人员提供了远程操作Hive的接口。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hive 权限 控制
![提示](https://static.bdocx.com/images/bang_tan.gif)