Hive用户权限管理理解

 

Hive用户权限管理理解

  3300人阅读  评论(0)  收藏  举报
  分类:

HiverServer2支持远程多客户端的并发和认证,支持通过JDBC、Beeline等连接操作。Hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用MySQL保存元数据。现在关心的是HiveServer如何基于mysql元数据库管理用户权限,其安全控制体系与LinuxHadoop的用户是否存在联系。

1)remote方式部署Hive

Hive中metastore(元数据存储)的三种方式:内嵌Derby方式、基于mysql的Local方式、基于mysql的Remote方式。显然多用户并发模式是采用remote方式部署,Hiveserver元数据放置在mysql数据库并在mysql建立用户,HiveClient远程连接。回顾下remote方式部署Hive:

第一步:元数据库mysql创建用户名和数据库;

第二步:HiveServer在 hive-site.xml 文件中配置jdbc URL、驱动、用户名、密码等属性;

<property>

 <name>javax.jdo.option.ConnectionURL</name>

  <value>jdbc:mysql://mysql server IP/hive_meta?createDatabaseIfNotExist=true</value>

  <description>JDBC connect string for aJDBC metastore</description>

</property>

<property>

 <name>javax.jdo.option.ConnectionDriverName</name>

 <value>com.mysql.jdbc.Driver</value>

  <description>Driver class name for aJDBC metastore</description>

</property>

<property>

 <name>javax.jdo.option.ConnectionUserName</name>

  <value>hive</value>

  <description>username to use againstmetastore database</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionPassword</name>

  <value>hive</value>

  <description>password to use againstmetastore database</description>

</property>

<property>

 <name>hive.metastore.warehouse.dir</name>

  <!-- base hdfs path -->

 <value>/user/hive/warehouse</value>

  <description>base hdfs path :locationof default database for the warehouse</description>

</property>

第三步:HiveClient在hive-site.xml 文件中配置thrift(负责client和server的通信)和存储路径;

<!--thrift://<host_name>:<port> 默认端口是9083 -->

<property>

  <name>hive.metastore.uris</name>

  <value>thrift://Hiveserver IP:9083</value>

  <description>Thrift uri for the remotemetastore. Used by metastore client to connect to remotemetastore.</description>

</property>

<!--  hive表的默认存储路径 -->

<property>

  <name>hive.metastore.warehouse.dir</name>

 <value>/user/hive/warehouse</value>

  <description>location of defaultdatabase for the warehouse</description>

</property>

< property >

   < name >hive.metastore.local</ name >

   < value >false</ value>

</ property >

第四步:HiveServer启动metastore监听

执行命令:hive--service metastore -p <port_num> //默认端口是9083

第五步:HiveClient执行hive命令。

上述5步,下图是很清晰的展现。


2)msyql元数据字典表

从remote方式部署的Hive看,还未体现出多用户管理及其权限控制,需进一步深入研究下图四个模块的关系。


Hive早期版本是通过Linux的用户和用户组来控制用户权限,无法对Hive表的CREATE、SELECT、DROP等操作进行控制。现Hive基于元数据库来管理多用户并控制权限。数据分为元数据和数据文件两部分,元数据存储在mysql,而数据文件则是HDFS,控制元数据即控制可访问的数据文件。

Hive在mysql上的元数据表主要分为:Database相关、Table相关、数据存储相关SDS、COLUMN相关、SERDE相关(序列化)、Partition相关(分区)、SKEW相关(数据倾斜)、BUCKET相关(分桶)、PRIVS相关(权限管理),对数据库-数据表、用户有相应关系体现。其中TBL_PRIVS存储了表/视图的授权信息,见如下数据字典:

元数据表字段

说明

示例数据

TBL_GRANT_ID

授权ID

1

CREATE_TIME

授权时间

1436320455

GRANT_OPTION

?

0

GRANTOR

授权执行用户

liuxiaowen

GRANTOR_TYPE

授权者类型

USER

PRINCIPAL_NAME

被授权用户

username

PRINCIPAL_TYPE

被授权用户类型

USER

TBL_PRIV

权限

Select、Alter

TBL_ID

表ID

22,对应TBLS表中的TBL_ID

再看mysql中存储Hive中所有数据库基本信息的表DBS数据字典:

元数据表字段

说明

示例数据

DB_ID

数据库ID

2

DESC

数据库描述

测试

DB_LOCATION_URI

数据库HDFS路径

hdfs://namenode/user/hive/warehouse/sample.db

NAME

数据库名

lxw1234

OWNER_NAME

数据库所有者用户名

lxw1234

OWNER_TYPE

所有者角色

USER

从mysql存储的Hive元数据表数据字典看,Hive是基于元数据mysql管理多用户权限,用户权限信息都存储在元数据表中。要重点理解是,mysql只是保存Hive的元数据,mysql本身的用户和Hive没有关系,Hive只是把自己的用户信息保存在mysql元数据表中。数据字典中关于权限元数据总结如下:

Db_privs:记录了User/Role在DB上的权限

Tbl_privs:记录了User/Role在table上的权限

Tbl_col_privs:记录了User/Role在table column上的权限

Roles:记录了所有创建的role

Role_map:记录了User与Role的对应关系

3)Hive用户权限管理

从remote部署hive和mysql元数据表字典看,已经明确hive是通过存储在元数据中的信息来管理用户权限。现在重点是Hive怎么管理用户权限。首先要回答的是用户是怎么来的,发现hive有创建角色的命令,但没有创建用户的命令,显然Hive的用户不是在mysql中创建的。在回答这个问题之前,先初步了解下Hive的权限管理机制。

第一:在hive-site.xml文件中配置参数开启权限认证

<property>

<name>hive.security.authorization.enabled</name>

<value>true</value>

<description>enableor disable the hive clientauthorization</description>

</property>

<property>

<name>hive.security.authorization.createtable.owner.grants</name>

<value>ALL</value>

<description>theprivileges automatically granted to the ownerwhenever a table gets created. Anexample like "select,drop" willgrant select and drop privilege to theowner of the table</description>

</property>

hive.security.authorization.enabled参数是开启权限验证,默认为false。

hive.security.authorization.createtable.owner.grants参数是指表的创建者对表拥有所有权限。

第二:Hive的权限管理是通过用户(User)、组(Group)、角色(Role)来定义,角色定义了权限,赋予给组或用户,用户归属于组。

角色相关命令:create role rolename、drop rolename、grant rolename to user username;

第三:Hive权限控制:

       操作

     解释

ALL

所有权限

ALTER

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

UPDATE

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

CREATE

允许进行Create操作

DROP

允许进行DROP操作

INDEX

允许建索引(目前还没有实现)

LOCK

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

SELECT

允许用户进行SELECT操作

SHOW_DATABASE

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

例子:把select权限授权给username用户,命令如下:

hive>grant select on database databasename to user username;

第四:为限制任何用户都可以进行Grant/Revoke操作,提高安全控制,需事先Hive的超级管理员。在hive-site.xml中添加hive.semantic.analyzer.hook配置,并实现自己的权限控制类HiveAdmin。

<property>

    <name>hive.semantic.analyzer.hook</name>

    <value>com.hive.HiveAdmin</value>

</property>

com.hive.HiveAdmin类代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.hive;  
  2. importorg.apache.hadoop.hive.ql.parse.ASTNode;  
  3. importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;  
  4. importorg.apache.hadoop.hive.ql.parse.HiveParser;  
  5. importorg.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;  
  6. importorg.apache.hadoop.hive.ql.parse.SemanticException;  
  7. importorg.apache.hadoop.hive.ql.session.SessionState;  
  8. publicclass  HiveAdmin extendsAbstractSemanticAnalyzerHook {  
  9. privatestatic String admin = "admin";  
  10.    @Override  
  11. publicASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext,  
  12. ASTNodeast)throws SemanticException {  
  13. switch(ast.getToken().getType()) {  
  14. caseHiveParser.TOK_CREATEDATABASE:  
  15. caseHiveParser.TOK_DROPDATABASE:  
  16. caseHiveParser.TOK_CREATEROLE:  
  17. caseHiveParser.TOK_DROPROLE:  
  18. caseHiveParser.TOK_GRANT:  
  19. caseHiveParser.TOK_REVOKE:  
  20. caseHiveParser.TOK_GRANT_ROLE:  
  21. caseHiveParser.TOK_REVOKE_ROLE:  
  22.              StringuserName = null;  
  23. if(SessionState.get() != null  
  24. &&SessionState.get().getAuthenticator()!= null){  
  25. userName=SessionState.get().getAuthenticator().getUserName();  
  26.             }  
  27. if(!admin.equalsIgnoreCase(userName)) {  
  28. thrownewSemanticException(userName  
  29.                         + " can't use ADMIN options,except " + admin +".");  
  30.             }  
  31. break;  
  32. default:  
  33. break;  
  34.         }  
  35. returnast;  
  36.     }  
  37. }  

这样只有admin用户这一超级管理员可以进行Grant/Revoke操作。

到此基本理解了Hive的用户权限管理框架,但核心问题还是Hive的用户组和用户来自于哪里?既不是mysql中的用户,Hive本身也不提供创建用户组和用户的命令。折腾一番后,突然理解Hive用户组和用户即Linux用户组和用户,和hadoop一样,本身不提供用户组和用户管理,只做权限控制。

到此可以梳理下Hive用户权限管理的简单流程:

第一步:创建超级管理员;

第二步:新建linux用户组和用户,也可以在既定用户组下建用户,赋予用户hive目录权限;

第三步:超级管理员进入hive,授权新建用户组和用户的操作权限;

第四步:客户端可以通过新建用户名和密码连接到hive执行授权内的动作;

4)Beeline工具

HiveServer2提供了一个新的命令行工具Beeline,它是基于SQLLine CLI的JDBC客户端。Beeline工作模式有两种,即本地嵌入模式和远程模式。嵌入模式情况下,它返回一个嵌入式的Hive(类似于Hive CLI);而远程模式则是通过Thrift协议与某个单独的HiveServer2进程进行连接通信。

%bin/beeline

beeline>!connect

jdbc:hive2://<host>:<port>/<db>;

auth=noSaslhiveuser password org.apache.hive.jdbc.HiveDriver

命令中db就是在hiveserver中配置好的数据库并授权hiveuser使用。

5)总结

首先hive用户来自linux,和hadoop一样,并具有组、用户、角色的管理体系,其权限信息保存在元数据库中。

当然hive安全认证还有很多需要进一步了解,以进一步管理hadoop集群平台。
0
0
 
 
我的同类文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. HIVE结构 Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数 据提取转化加载 (ETL),这是一种可以存储、 查询和分析存储在 Hadoop 中的大规模数据的 机制。 Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。 同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理 内建的 mapper 和 reducer 无法完成的复杂的分析工作。 1.1HIVE 架构 Hive 的结构可以分为以下几部分: 用户接口:包括 CLI, Client, WUI 元数据存储。通常是存储在关系数据库如 mysql, derby 中 6 解释器、编译器、优化器、执行器 Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算 1、 用户接口主要有三个: CLI,Client 和 WUI。其中最常用的是 CLI , Cli 启动的时候, 会同时启动一个 Hive 副本。 Client 是 Hive 的客户端,用户连接至 Hive Server 。 在启动 Client 模式的时候, 需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server 。 WUI 是通过浏览器访问 Hive 。 2、 Hive 将元数据存储在数据库中,如 mysql 、 derby 。 Hive 中的元数据包括表的名字, 表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 3、 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及 查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。 4、 Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比 如 select * from tbl 不会生成 MapRedcue 任务)。 1.2Hive 和 Hadoop 关系 Hive 构建在 Hadoop 之上, HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任 务,如: select * from table ) Hadoop和 Hive 都是用 UTF-8 编码的 7 1.3Hive 和普通关系数据库的异同 Hive RDBMS 查询语言 HQL SQL 数据存储 HDFS Raw Device or Local FS 索引 无 有 执行 MapReduce Excutor 执行延迟 高 低 处理数据规模 大 小 1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计 了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开 发。 2. 数据存储位置。 Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中 的。而数据库则可以将数据保存在块设备或者本地文件系统中。 3. 数据格式。 Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数 据格式需要指定三个属性:列分隔符(通常为空格、” t ”、” x001″)、行分隔符 (” n”)以及读取文件数据的方法( Hive 中默认有三个文件格式 TextFile , SequenceFile 以及 RCFile )。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此, Hive 在加载的过程中不会对数据本身进行任何修 改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数 据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储, 因此,数据库加载数据的过程会比较耗时。 4. 数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。 因此, Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。 而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ... VALUES 添加数据,使用 UPDATE ... SET 修改数据。 5. 索引。之前已经说过, Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会 对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。 Hive 要访问数据中满足 条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引 入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问, Hive 仍然 可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特 定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较 高,决定了 Hive 不适合在线数据查询。 6. 执行。 Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。
Hive可以通过元数据的权限管理和文件存储级别的权限管理来实现权限控制。在使用Hive的授权机制之前,需要在hive-site.xml中设置两个参数:hive.security.authorization.enabled和hive.security.authorization.createtable.owner.grants。hive.security.authorization.enabled用于启用或禁用Hive客户端的授权机制,而hive.security.authorization.createtable.owner.grants用于设置在创建表时自动授予表所有者的权限。 在Hive中,权限控制的核心是用户、组和角色。角色可以理解为有一些相同属性的用户或组的集合。用户和组使用的是Linux机器上的用户和组,而角色需要自己创建。可以通过创建角色并赋予相应的权限,然后将角色分配给用户或组,来实现指定用户访问指定数据库的权限控制。 通过Hive权限管理,可以实现对库级别、表级别和列级别的访问权限控制。这样可以确保Hive的使用符合数据仓库的安全原则。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hive 如何进行权限控制](https://blog.csdn.net/weixin_59295776/article/details/122372080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Hive权限设置说明](https://download.csdn.net/download/javajxz008/10546997)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值