cloudera manager下的hive权限配置

本文介绍了一种在Cloudera环境中实现Hive权限管理的方法,包括如何限制非管理员用户进行权限更改,以及如何配置Hive以使用其原生授权机制而非Sentry。此外,还详细说明了权限配置的具体步骤。

前言


公司运营、BI以及财务不同部门不同人员需要hive数据查询服务,所以需要分配不同的权限给相关人员

权限配置主要涉及两项:

- 认证(authentication):验证用户所用的身份是否是对的
- 授权(authorization):验证用户所用身份操作是否有权限

cloudera集成的hive认证支持常用的LDAP和kerberos,授权使用的是他自家的sentry,sentry目前还处在孵化中。为了推广他自家的产品,屏蔽了hive的授权管理

针对我的需求,用户统一在hue界面操作hive,分配不同表权限给不同的用户,权限的授予只需要一个管理员账户;授权使用hive原生的

配置

认证配置

hive默认所有用户都可以做权限的更改,配置为只有管理员(如admin)才能修改权限
使用钩子做身份拦截,如果用户不为admin且操作权限管理操作,拒绝,代码示例如下:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.session.SessionState;

public class HiveAdmin extends AbstractSemanticAnalyzerHook {
    private static String admin = "admin";
    private static final Log LOG = LogFactory.getLog(HiveAdmin.class);

    @Override
    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
                              ASTNode ast) throws SemanticException {
        String userName = null;
        String Authenticator="null";

        switch (ast.getToken().getType()) {
            case 692: //grant
            case 646:// CREATE ROLE amengzi;
            case 675:// DROP ROLE amengzi
            case 694: //GRANT ROLE amengzi to user amengzi;
            case 793:// REVOKE ROLE amengzi FROM user amengzi;

//            case 647://create table test11(id string)
//            case 676://drop table test;
//            case 783://select * from test;
//            case 817://show grant
//            case 671: //drop database;
                if (SessionState.get() != null
                            && SessionState.get().getAuthenticator() != null) {
                    Authenticator = SessionState.get().getAuthenticator().toString();
                    userName = SessionState.get().getAuthenticator().getUserName();
                }
                if (!admin.equalsIgnoreCase(userName)) {
                    System.out.println("===================can't use ADMIN options, except");
                    throw new SemanticException(userName
                                                        + " can't use ADMIN options, except " + admin + ".");
                }
                break;
            default:
                break;
        }

        int tokeType=ast.getToken().getType();
        LOG.error("tokeType:"+tokeType+"=======user " + SessionState.get().getAuthenticator().getUserName()+" Authenticator "+SessionState.get().getAuthenticator().toString());
        System.out.println("tokeType:"+tokeType+"===================user: " + SessionState.get().getAuthenticator().getUserName()+" Authenticator "+SessionState.get().getAuthenticator().toString());
        return ast;
//        return super.preAnalyze(context, ast);
    }

//    @Override
//    public void postAnalyze(HiveSemanticAnalyzerHookContext context,
//                            List<Task<? extends Serializable>> rootTasks)
//            throws SemanticException {
//        console.printInfo("!! SimpleSemanticPreAnalyzerHook postAnalyze called !!");
//        super.postAnalyze(context, rootTasks);
//    }
}

在使用客户端hive时,会显示向控制台输出的语句,便于调试
在hue上操作时,logger的输出会在hiveserver2日志中输出

授权配置

cloudera默认用org.apache.hadoop.hive.ql.parse.authorization.RestrictedHiveAuthorizationTaskFactoryImpl替换hive的org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl做权限屏蔽,需要通过配置文件使用原生hive类

从CM界面放入以下配置于hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)和hive-site.xml 的 HiveServer2 高级配置代码段(安全阀)

<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>

<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl</value>
</property>

<property>
<name>hive.semantic.analyzer.hook</name>
<value>HiveAdmin</value>
</property>

这里写图片描述

注意:后续hdfs权限需要做相应修改
在namenode活动节点创建需要的用户账户
如果使用hue,linux账户和hue的账户可以同步hue useradmin_sync_with_unix
启用了hive权限之后发现hue和hive客户端都没有创建数据库的权限,我需要客户端能过创建数据酷,所以“hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)“不作配置,这样HiveAdmin的jar包只需放到hiveserver2所在主机/opt/cloudera/parcels/CDH-5.4.4-1.cdh5.4.4.p0.4/lib/hive/lib/下就可以,如果hive-site客户端也配置了权限,则jar需要放到hive lib下
如果想后端也加上权限,又想可以创建数据库,则方案可以配置为单独一台机子不做权限配置,用来做数据库创建
hue和hive有一个坑导致不能相同授权重复,所以授权操作需要通过hive客户端来操作

<think>我们正在解决的是:如何配置Kettle连接由Cloudera Manager(CDH)管理的Hive集群。 引用资料中,引用[1]提到了在Kettle7中连接Hive和HBase的配置方法,需要将一些jar包放到指定目录下。 引用[2]提到了两种将数据导入Hive的方式:一种是通过HiveServer2的JDBC连接,另一种是使用Hadoop File Input并配合Hive命令加载。 引用[3]和[5]提到了Cloudera Manager(CDH)是Hadoop的一个分发版本,提供了图形化管理界面。 引用[4]提供了一个关键信息:在CDH环境下,需要从Cloudera Manager的Agent节点中拷贝hadoop-common-2.6.0-cdh5.14.0.jar到Kettle的lib目录下,并重启Kettle。 但注意,用户使用的是CDH管理的Hive,因此我们需要适配CDH的版本。由于用户没有提供具体的CDH版本,我们将以通用方法说明。 步骤: 1. 确定CDH版本和对应的Hadoop、Hive版本。例如,CDH5.14.0对应的Hadoop版本是2.6.0-cdh5.14.0,Hive版本是1.1.0-cdh5.14.0(这里只是示例,具体版本需要用户确认)。 2. 获取CDH版本的Hadoop和Hive相关jar包。通常,这些jar包位于Cloudera Manager集群的各个节点上,路径为:/opt/cloudera/parcels/CDH-<version>/lib/<component>/lib/(或者参考引用[4]中的路径)。 3. 配置Kettle的Big Data插件,选择对应的Shim层(如cdh5140,注意Kettle9.1内置的Shim可能不支持CDH5.14.0,需要确认或自定义配置)。 具体步骤: 一、准备CDH版本的Jar包 根据引用[4]的思路,我们需要以下jar包: - hadoop-common-<cdh-version>.jar(例如:hadoop-common-2.6.0-cdh5.14.0.jar) - Hive JDBC驱动(hive-jdbc-<cdh-version>.jar) 注意:如果Kettle的Big Data插件已经提供了对应CDH版本的Shim层(如cdh5140),则只需要将CDH的配置文件放到该Shim层目录下,并确保jar包匹配。但如果没有,则需要自定义配置。 二、配置步骤: 1. 在Kettle的Big Data插件目录(plugins/pentaho-big-data-plugin/hadoop-configurations)下,找到对应CDH版本的Shim层目录(例如cdh5140)。如果没有,可以复制一个相近的目录并重命名。 2. 将CDH集群上的Hadoop配置文件(core-site.xml, hdfs-site.xml, hive-site.xml等)复制到该Shim层目录下。 3. 将CDH版本的hadoop-common.jar放入该Shim层目录下的lib文件夹中(如果没有lib文件夹则创建)。 4. 将CDH版本的Hive JDBC驱动(hive-jdbc-*.jar)放入Kettle的lib目录(即Kettle安装目录下的lib文件夹)或者放入该Shim层目录下的lib文件夹(推荐前者,因为多个Shim层可能共用)。 三、修改plugin.properties 在Shim层目录(cdh5140)下的plugin.properties文件中,配置: active.hadoop.configuration=cdh5140 hadoop.configurations.version=<实际版本号,例如2.6.0-cdh5.14.0> 四、在Kettle中创建Hive连接 1. 使用JDBC方式连接Hive: - JDBC URL: jdbc:hive2://<hive_server2_host>:<port>/<database> - 驱动类:org.apache.hive.jdbc.HiveDriver - 根据需要设置用户名和密码(如果HiveServer2开启了认证)。 2. 如果使用Hadoop File Input方式(批量导入),则需要配置Hadoop集群连接(在Kettle中叫做Hadoop Cluster),指向CDH集群,并选择我们配置的Shim层(cdh5140)。 注意:由于CDH版本和Kettle内置的Shim层可能不完全匹配,可能需要调整其他jar包。如果遇到类冲突或缺失,需要将CDH中的相关jar包添加到Shim层的lib目录下。 五、常见问题 1. 类找不到:检查jar包是否齐全,特别是Hive和Hadoop相关的依赖。 2. 版本不匹配:确保所有jar包来自同一CDH版本。 3. 配置文件错误:确保从CDH集群中复制了正确的配置文件(如core-site.xml, hdfs-site.xml, hive-site.xml)。 六、引用[4]的方法:拷贝hadoop-common.jar到Kettle的lib目录下(注意,这种方法可能不够灵活,因为不同集群可能需要不同的版本。推荐使用Shim层的方式,这样可以为不同的集群配置不同的设置。) 因此,我们给出两种方案: 方案一(推荐):使用Big Data插件的Shim层配置 方案二:将CDH的hadoop-common.jar放到Kettle的lib目录(全局生效),然后重启Kettle。 由于用户使用的是Cloudera Manager管理的集群,我们更推荐使用方案一,因为它可以支持多个不同版本的集群配置。 下面我们详细描述方案一的步骤。 步骤详解: 1. 确认CDH版本和组件版本 例如:CDH 5.14.0,Hadoop 2.6.0-cdh5.14.0, Hive 1.1.0-cdh5.14.0 2. 在Kettle的hadoop-configurations目录下创建新的Shim层配置(例如cdh5140) ```bash cd /opt/kettle/plugins/pentaho-big-data-plugin/hadoop-configurations cp -r hdp300 cdh5140 # 复制一个已有的配置作为模板 ``` 3. 复制CDH集群的配置文件到cdh5140目录 从CDH集群的任意节点(最好是从安装了Hive Gateway的节点)上获取配置文件: - /etc/hadoop/conf/core-site.xml - /etc/hadoop/conf/hdfs-site.xml - /etc/hadoop/conf/yarn-site.xml(如果需要在YARN上运行作业) - /etc/hive/conf/hive-site.xml 将这些文件复制到cdh5140目录下。 4. 修改cdh5140目录下的plugin.properties ```properties # 设置该配置为活动状态 active.hadoop.configuration=cdh5140 # 覆盖版本号,确保和实际版本一致 hadoop.configurations.version=2.6.0-cdh5.14.0 ``` 5. 获取并放置jar包 - 将CDH的hadoop-common-2.6.0-cdh5.14.0.jar放入cdh5140/lib目录下(如果没有lib目录则创建) - 将CDH的Hive JDBC驱动(hive-jdbc-1.1.0-cdh5.14.0.jar)放入Kettle的lib目录(/opt/kettle/lib) 注意:Hive JDBC驱动可能依赖其他jar包,如hive-service、hive-metastore等。如果连接时出现类缺失,需要将这些依赖的jar包也放入Kettle的lib目录(或者使用Shim层的lib目录,但Shim层通常只用于Hadoop相关的jar包,所以推荐放全局lib)。 6. 重启Kettle 7. 在Kettle中配置Hive连接 - 使用“Hadoop Cluster”配置连接到CDH集群:选择我们创建的配置(cdh5140) - 使用“Hive”连接类型,通过JDBC连接HiveServer2 注意:如果CDH集群启用了Kerberos认证,则需要额外配置Kerberos,这包括: - 在Kettle中设置JAAS配置 - 将krb5.conf文件放到Kettle所在机器的/etc目录(或JRE的lib/security目录) - 在Kettle的Hadoop集群配置中启用安全认证 由于问题中没有提到Kerberos,这里暂不展开。 最后,我们生成相关问题: 1. 如何配置Kettle连接启用Kerberos的CDH Hive集群? 2. 如何在Kettle中配置多个不同的Hadoop集群? 3. 使用Kettle连接CDH Hive时出现ClassNotFoundException如何解决? 注意:以上步骤基于CDH5.14.0,如果用户使用其他CDH版本,需要替换版本号。 </think>### Kettle 连接 Cloudera Manager 管理的 Hive 配置指南 #### 一、核心配置步骤 1. **获取 Cloudera Manager 的 Hadoop Common JAR** ```bash # 从 Cloudera Manager 节点拷贝关键 JAR(替换实际版本) scp <cm-node>:/opt/cloudera/parcels/CDH-*/jars/hadoop-common-*.jar \ $KETTLE_HOME/lib/ ``` - 需替换 `<cm-node>` 为 Cloudera Manager 节点地址 - 文件路径示例:`/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-common-3.0.0-cdh6.3.2.jar` [^4] 2. **配置 Shim 层映射** 在 `$KETTLE_HOME/plugins/pentaho-big-data-plugin/plugin.properties` 中添加: ```properties # 映射 CDH 版本到内置 Shim cdh.version.mapping.6.3.2=cdh630 active.hadoop.configuration=cdh630 ``` 3. **部署 CDH 配置文件** ```bash # 创建 Shim 层目录 mkdir $KETTLE_HOME/plugins/pentaho-big-data-plugin/hadoop-configurations/cdh630 # 复制配置文件 scp <cm-node>:/etc/hadoop/conf/*-site.xml \ $KETTLE_HOME/plugins/pentaho-big-data-plugin/hadoop-configurations/cdh630/ ``` ![Cloudera Manager 配置文件位置](https://example.com/cm-config-path.png) *图:Cloudera Manager配置文件默认路径* --- #### 二、Hive 连接方式 ##### 方式1:HiveServer2 JDBC 连接(推荐) 1. **在 Kettle 中新建数据库连接** - 连接类型:`Hadoop Hive` - 主机名:HiveServer2 服务地址 - 端口:`10000`(默认) - 数据库名称:目标数据库 - JDBC URL 格式: ```sql jdbc:hive2://hive-server.cm.cluster:10000/default ``` 2. **驱动配置** ```properties # 驱动类名 org.apache.hive.jdbc.HiveDriver # 所需 JAR(从 CDH 节点获取) hive-jdbc-*.jar hive-service-*.jar ``` ##### 方式2:HDFS 文件加载(批量场景) ```mermaid graph LR A[Kettle 作业] --> B[Hadoop File Output] B --> C{HDFS 文件} C --> D[Shell 脚本] D --> E[LOAD DATA INPATH...] ``` 1. 使用 **Hadoop File Output** 步骤写入 HDFS 2. 调用 Shell 脚本执行 Hive 加载命令: ```bash hive -e "LOAD DATA INPATH '/user/kettle/output' INTO TABLE target_table" ``` --- #### 三、Cloudera Manager 集成要点 1. **安全认证配置** - Kerberos:在 `krb5.conf` 配置 realm ```ini [realms] CM.CLUSTER = { kdc = kdc-server.cm.cluster admin_server = admin-server.cm.cluster } ``` - Sentry/Ranger:在 Hive 连接中配置权限角色 2. **高可用连接** ```sql # 连接 HiveServer2 HA 集群 jdbc:hive2://hs2-node1:10000,hs2-node2:10000/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2 ``` 3. **性能优化参数** | 参数 | 推荐值 | 作用 | |------|--------|------| | `hive.fetch.task.conversion` | `more` | 减少 MR 任务 | | `hive.exec.parallel` | `true` | 启用并行执行 | | `mapreduce.job.queuename` | `kettle` | 指定 YARN 队列 | --- #### 四、验证与诊断 1. **连接测试命令** ```bash beeline -u "jdbc:hive2://hive-server:10000" \ -n kettle_user \ -p <password> \ -e "SHOW TABLES" ``` 2. **常见错误处理** **问题:ClassNotFoundException** ```log java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf ``` **解决**:将 CDH 的 `hive-common-*.jar` 添加到 `$KETTLE_HOME/lib` **问题:Zookeeper 服务发现失败** **解决**:确认 ZooKeeper 地址并在 JDBC URL 添加参数: ```sql ;zooKeeperNamespace=hiveserver2;serviceDiscoveryMode=zooKeeper ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值