`
zhangxiong0301
  • 浏览: 359085 次
社区版块
存档分类
最新评论

hive多用户权限控制

    博客分类:
  • HIVE
 
阅读更多

当多个不同角色的用户共用hive时,需要对不同的角色做不同的权限控制。权限控制主要指底层的hdfs文件操作控制和hive自身的对表的授权管理。

 

首先,安装hive。hive装好后以管理员身份启动hive,即执行命令:hive -hiveconf hive.root.logger=DEBUG,console

报错如下:

 

2014-02-13 16:48:59,968 ERROR DataNucleus.Datastore (Log4JLogger.java:error(115)) - Error thrown executing CREATE 

TABLE `SD_PARAMS`
  14 (
  15     `SD_ID` BIGINT NOT NULL,
  16     `PARAM_KEY` VARCHAR(256) BINARY NOT NULL,
  17     `PARAM_VALUE` VARCHAR(4000) BINARY NULL,
  18     CONSTRAINT `SD_PARAMS_PK` PRIMARY KEY (`SD_ID`,`PARAM_KEY`)
  19 ) ENGINE=INNODB : Specified key was too long; max key length is 767 bytes
  20 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 

bytes

 

 

 解决方法:删掉元数据库,重新建立数据库并指定字符集:create database hive43 character set latin1;

 

然后,再以非管理员账号启动hive,报错如下:

 

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: 权限不够
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:351)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:689)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:633)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.io.IOException: 权限不够
        at java.io.UnixFileSystem.createFileExclusively(Native Method)
        at java.io.File.createNewFile(File.java:1006)
        at java.io.File.createTempFile(File.java:1989)
        at org.apache.hadoop.hive.ql.session.SessionState.createTempFile(SessionState.java:452)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:349)
        ... 7 more

 

 

解决办法,这个主要是由于hive配置文件中配置的一些临时或存放中间结果的目录权限设置问题,导致当前登陆hive的用户没权限访

 

问这些目录。主要涉及如下两个参数:

 

<property>
  <name>hive.exec.scratchdir</name>
  <value>hdfs://cluster1/tmp/hive/jobdata</value>
  <description>Scratch space for Hive jobs</description>
</property>

<property>
  <name>hive.exec.local.scratchdir</name>
  <value>/data/hadoop/hivelocaljobdata</value>
  <description>Local scratch space for Hive jobs</description>
</property>

 

 

从上可知需要修改对应的hdfs和本地两个目录的权限,修改为666即可,注意路径上的所有父目录路径也要有相应的访问权限。

 

到这里,hive基本可以支持多个用户跑起来了。从而可以着手hive用户对底层文件的访问权限,主要通过设置3个参数完成。

 

 

<property>
  <name>hive.files.umask.values</name>
  <value>0022</value>
  <description>当hive在hdfs上创建文件时,对应的默认掩码。此处的0022,第一个0表示八进制;剩下       的022用二进制表示即000010010,然后取反得111101101,即rwxr-xr-x,这样其他用户登录hive       或hdfs时候,就没权限删除该文件</description>
</property>

<property>
  <name>hive.metastore.authorization.storage.checks</name>
  <value>true</value>
  <description>Should the metastore do authorization checks against the underlying storage for operations like drop-partition (disallow the drop-partition if the user in question doesn't have permissions to delete the corresponding directory on the storage),就是配合hive.files.umask.values参数做权限控制.</description>
</property>

<property>
  <name>hive.metastore.execute.setugi</name>
  <value>true</value>
  <description>In unsecure mode, setting this property to true will cause the metastore to execute DFS operations using the client's reported user and group permissions. Note that this property must be set on both the client and server sides. Further note that its best effort. If client sets its to true and server sets it to false, client setting will be ignored.简单说就是,hadoop在非安全模式(未使用kerborers认证)时,使用hive客户端进程对应的用户和组权限操作hdfs</description>
</property>

 

 

通过以上配置,进入hive的用户就不能随意对底层文件随意操作了,必须具有相应权限。接下来可以进行hive自身类似mysql一样的权限授权管理了。只不过这种权限不完善,只能防止误操作;要做好一点,可以用自定义超级管理员权限缓解这个问题。

首先,要开启权限功能开关,即两项配置:

 

<property> 
   <name>hive.security.authorization.enabled</name> 
   <value>true</value> 
   <description>enable or disable the hive client authorization.开启权限验证</description> 
</property> 
<property> 
   <name>hive.security.authorization.createtable.owner.grants</name> 
   <value>ALL</value> 
   <description>the privileges automatically granted to the owner whenever a table gets created. An example like "select,drop" will grant select and drop privilege to the owner of the table.表的创建者对表拥有所有权限.
   </description>
</property>

 

 

Hive授权的核心就是用户、组、角色。Hive中的角色和平常我们认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。

用户 组

       张三 G_db1

       李四 G_db2

       王五 G_bothdb

如上有三个用户分别属于G_db1、G_db2、G_alldb。G_db1、G_db2、G_ bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。这样只要将role_eb    1赋给G_db1(或者该组的所偶用户),将role_eb2赋给G_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予G_bothdb,则G_bothdb中的用户可以访问两个数据库。

 

使用和组使用的是Linux机器上的用户和组,而角色必须自己创建。注意:如果有一个属于组bar的用户foo,他通过cli连接到远程的Server上执行操作,而远程的Server上有一个用户foo属于baz组,则在权限控制中foo是对应的baz组的。 

简单的权限操作示例如下:

 

 

CREATE ROLE ROLE_NAME

DROP ROLE ROLE_NAME 

grant/revoke:

GRANT ROLE role_name [, role_name] ... TO principal_specification [, principal_specification] ... 

REVOKE ROLE role_name [, role_name] ... FROM principal_specification [, principal_specification] ... 

principal_specification   :

USER user   | GROUP group   | ROLE role 


示例:

create role testrole;
grant role testrole to user yinxiu; 
SHOW ROLE GRANT user yinxiu; 
revoke role testrole from user yinxiu; 

 

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 允许用户查看可用的数据库

 

权限和hive常用操作的对应关系如下:

 

Operation ALTER UPDATE CREATE DROP INDEX LOCK SELECT SHOW_DATABASE
LOAD              
EXPORT              
IMPORT            
CREATE TABLE              
CREATE TABLE AS SELECT            
DROP TABLE              
SELECT              
ALTER TABLE ADD COLUMN              
ALTER TABLE REPLACE COLUMN              
ALTER TABLE RENAME              
ALTER TABLE ADD PARTITION              
ALTER TABLE DROP PARTITION              
ALTER TABLE ARCHIVE              
ALTER TABLE UNARCHIVE              
ALTER TABLE SET PROPERTIES              
ALTER TABLE SET SERDE              
ALTER TABLE SET SERDEPROPERTIES              
ALTER TABLE CLUSTER BY              
ALTER TABLE PROTECT MODE              
ALTER PARTITION PROTECT MODE              
ALTER TABLE SET FILEFORMAT              
ALTER TABLE SET LOCATION              
ALTER PARTITION SET LOCATION              
ALTER TABLE CONCATENATE              
ALTER PARTITION CONCATENATE              
SHOW DATABASE              
LOCK TABLE              
UNLOCK TABLE              

 

 

开启权限控制有Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员”,必须添加hive.semantic.analyzer.hook配置,并实现自己的权限控制类。

复制代码
 1 /*
 2  * Copyright (c) 2010-2013 All Rights Reserved.
 3  *
 4  * Author     :
 5  * Version    :1.0
 6  * Create Date:2013-6-13
 7  */
 8 package com.xxx.hive;
 9 
10 import org.apache.hadoop.hive.ql.parse.ASTNode;
11 import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
12 import org.apache.hadoop.hive.ql.parse.HiveParser;
13 import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
14 import org.apache.hadoop.hive.ql.parse.SemanticException;
15 import org.apache.hadoop.hive.ql.session.SessionState;
16 
17 /**
18  * 设置Hive超级管理员
19  * 
20  * @author 
21  * @version $Id: AuthHook.java,v 0.1 2013-6-13 下午3:32:12 yinxiu Exp $
22  */
23 public class AuthHook extends AbstractSemanticAnalyzerHook {
24     private static String admin = "xxxxxx";
25 
26     @Override
27     public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
28             ASTNode ast) throws SemanticException {
29         switch (ast.getToken().getType()) {
30         case HiveParser.TOK_CREATEDATABASE:
31         case HiveParser.TOK_DROPDATABASE:
32         case HiveParser.TOK_CREATEROLE:
33         case HiveParser.TOK_DROPROLE:
34         case HiveParser.TOK_GRANT:
35         case HiveParser.TOK_REVOKE:
36         case HiveParser.TOK_GRANT_ROLE:
37         case HiveParser.TOK_REVOKE_ROLE:
38             String userName = null;
39             if (SessionState.get() != null
40                     && SessionState.get().getAuthenticator() != null) {
41                 userName = SessionState.get().getAuthenticator().getUserName();
42             }
43             if (!admin.equalsIgnoreCase(userName)) {
44                 throw new SemanticException(userName
45                         + " can't use ADMIN options, except " + admin + ".");
46             }
47             break;
48         default:
49             break;
50         }
51         return ast;
52     }
53 }
复制代码

 

添加了控制类之后还必须添加下面的配置:

<property> 
    <name>hive.semantic.analyzer.hook</name> 
    <value>com.xxx.AuthHook</value>  
</property>

若有使用hiveserver,hiveserver必须重启。至此,只有xxxxxx用户可以进行Grant/Revoke操作。

 

 

分享到:
评论

相关推荐

    hive-role.zip

    "hive-role.zip" 文件看起来是与 Hive 的权限管理和配置相关的资源包,可能包含了一些实现 Hive 角色权限控制所需的 jar 包。下面将详细探讨 Hive 的权限设置及其相关知识点。 1. **Hive 的角色权限机制**: Hive ...

    07--Hive权限管理1

    - `hive.users.in.admin.role` 指定哪些用户具有管理员权限,如`root`。 - `hive.security.authorization.manager` 设置权限管理器,例如`org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd....

    hive3.1.2+mysql驱动.zip

    这提供了更强大的元数据管理功能,比如高可用性、数据备份和恢复,同时也便于多用户环境下的权限管理和访问控制。在Hive 3.1.2中,正确配置MySQL驱动后,可以实现Hive与MySQL之间的无缝连接,确保数据操作的稳定性。...

    Hive编程指南+HIVE从入门到精通+Hive高级编程+Apache Oozie

    5. **数据安全与权限**: 实现Hive的用户访问控制和数据安全性,例如使用Hive Metastore ACLs。 **Apache Oozie** Oozie是Hadoop作业的调度和管理系统,它可以协调Hadoop相关的任务,如Hive、Pig、MapReduce和Sqoop...

    hive入门.pdf

    - **权限管理**:Hive的权限控制主要基于文件级别,即用户的访问权限取决于他们对文件系统的访问权限。如果一个用户对某张表所对应的文件具有读取权限,则该用户也能对该表进行读取操作。 - **分区功能**:Hive支持...

    hive等配置文档

    此外,还需创建一个Hive用户并给予相应的权限。安装完成后,可以通过Hive命令行工具检验与MySQL的连接是否正常,例如创建表、加载数据等操作。 以上是Hadoop、Hive和相关组件的基础配置步骤。在实际部署中,还需要...

    hive安装包Linux包

    2. **Hive Server2**: 可以通过Hive Server2提供远程访问接口,支持多用户并发查询。 3. **Hcatalog**: 用于共享元数据,使得其他数据处理工具(如Pig、MapReduce)可以访问Hive中的数据。 4. **WebHCat ...

    快捷删除hive表的工具

    这个工具封装了处理权限的方法,确保即使在用户权限不足的情况下也能彻底删除表。这防止了因为权限不足导致的删除失败或者删除不完全的问题,从而避免了数据泄露的风险。 4. **基于Java开发**:由于Java的跨平台性...

    kittle连接hive需要的jar包

    - 注意Hive的权限设置,Kettle运行的用户需要有足够的权限来访问Hive资源。 以上就是关于Kettle连接Hive所需JAR包及其作用的详细解释,以及如何配置和使用这些JAR包来实现Kettle与Hive的交互。正确配置和使用这些...

    windows下hive的可执行文件

    需要注意的是,由于Hadoop和Hive主要为Linux设计,Windows上的安装和配置可能会遇到更多问题,如文件路径格式、权限控制和依赖库的不兼容等。因此,用户可能需要查阅官方文档、社区论坛或教程来解决遇到的问题。

    hive的安装与配置头歌.zip

    例如,可以通过设置多个 metastore 服务实现高可用,通过 Sentry 或 Ranger 提供数据访问权限控制,通过调整执行引擎(如 Tez、Spark)和并行度参数来优化查询性能。 总之,Hive 的安装与配置是一个涉及多步操作的...

    HIVE PDF PDF

    - **连接并配置MySQL数据库**:连接MySQL,创建`metastore`数据库,并创建`hiveuser`用户,授予相应的权限。 #### 4. Hive与Zookeeper集成 Hive使用Zookeeper来协调集群中的多个HiveServer2实例,并通过`hive....

    ranger-2.0.0-hive-plugin.tar.gz

    1. **权限管理**:Ranger 提供了细粒度的权限控制,允许管理员定义用户或组对Hive表、列、行级别的访问权限。这有助于保护敏感数据,确保只有授权用户才能访问特定资源。 2. **审计日志**:Ranger 提供全面的审计...

    apache-hive-2.0.0

    8. **安全特性**:支持 Hadoop 的安全特性,如 Kerberos 认证和 ACLs 权限控制。 在压缩包 "apache-hive-2.0.0-src" 中,你会找到 Hive 的源代码,包括解析器、编译器、优化器、执行器等多个组件。通过阅读这些代码...

    hive所需jar包

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL类查询语言(HQL)来处理存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。Hive提供了数据仓库架构,包括元数据、SQL查询、以及结果...

    Hive 编程指南

    - **Hive权限控制**:使用Hive的Metastore服务实现用户和角色的权限管理。 - **Hadoop Security**:结合Kerberos进行身份验证,确保数据安全。 9. **Hive的应用场景**: - **日志分析**:对大量用户行为日志进行...

    hive-3.1.2&mysql-5.7.2安装包.rar

    配置 MySQL 服务器,创建用户、数据库和权限,确保 Hive 可以安全地访问。在 Hive 中设置 metastore(元数据存储)连接,可以选择本地 MySQL 实例作为 metastore 服务,这将提高 Hive 的性能和数据一致性。 总的来...

    Hive的三种方式安装与搭建

    这种方式非常适合生产环境,因为它不仅能够支持多用户访问,还能够提供更好的性能和可靠性。 #### 三、准备工作 在开始安装之前,我们需要完成一些基本的准备工作: 1. **安装MySQL**:Hive的Remote方式需要用到...

    hive测试数据

    9. **安全性**:Hive支持角色基础的权限管理,可以设置不同级别的访问控制,确保数据安全。 10. **Hive的最新发展**:随着技术的发展,Hive现在支持ACID事务、实时查询(如Hive on Tez和Hive on Spark)和更高效的...

    hive Windows 可执行文件

    8. **权限问题**:Windows环境下,可能不会遇到Unix的权限问题,但在多用户环境中,确保每个用户都有合适的访问权限。 通过这个Windows版本的Hive可执行文件,你可以更方便地在本地进行Hadoop数据仓库的开发和测试...

Global site tag (gtag.js) - Google Analytics