为什么80%的码农都做不了架构师?>>>   

思考

看了hive配置权限管理的方式之后发现,其实之前修改的Operation2Privilege是为权限管理类SQLStdHiveAuthorizerFactory服务的,那么是否可以用aux的方式把一整套的SQLStdHiveAuthorizerFactory的代码全都替换掉呢。

分析配置和代码

SQL Standard Based Hive Authorization官网给出的权限配置方式中需要进行以下配置

-hiveconf hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory

查看该类的源码

package org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd;import org.apache.hadoop.hive.common.classification.InterfaceAudience.Private;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizer;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerFactory;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerImpl;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthzPluginException;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthzSessionContext;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveMetastoreClientFactory;@Private
public class SQLStdHiveAuthorizerFactory implements HiveAuthorizerFactory{@Overridepublic HiveAuthorizer createHiveAuthorizer(HiveMetastoreClientFactory metastoreClientFactory,HiveConf conf, HiveAuthenticationProvider authenticator, HiveAuthzSessionContext ctx) throws HiveAuthzPluginException {SQLStdHiveAccessControllerWrapper privilegeManager =new SQLStdHiveAccessControllerWrapper(metastoreClientFactory, conf, authenticator, ctx);return new HiveAuthorizerImpl(privilegeManager,new SQLStdHiveAuthorizationValidator(metastoreClientFactory, conf, authenticator,privilegeManager, ctx));}
}

很简单,只是对SQLStdHiveAuthorizationValidator的一个封装 接下来查看SQLStdHiveAuthorizationValidator类 该类也不是很复杂,只有150+行代码,下面给出关键代码checkPrivileges方法:

private void checkPrivileges(HiveOperationType hiveOpType, List<HivePrivilegeObject> hiveObjects,IMetaStoreClient metastoreClient, String userName, IOType ioType, List<String> deniedMessages)throws HiveAuthzPluginException, HiveAccessControlException {if (hiveObjects == null) {return;}// Compare required privileges and available privileges for each hive objectfor (HivePrivilegeObject hiveObj : hiveObjects) {RequiredPrivileges requiredPrivs = Operation2Privilege.getRequiredPrivs(hiveOpType, hiveObj,ioType);if(requiredPrivs.getRequiredPrivilegeSet().isEmpty()){// no privileges required, so don't need to check this object privilegescontinue;}// find available privilegesRequiredPrivileges availPrivs = new RequiredPrivileges(); //start with an empty priv set;switch (hiveObj.getType()) {case LOCAL_URI:case DFS_URI:availPrivs = SQLAuthorizationUtils.getPrivilegesFromFS(new Path(hiveObj.getObjectName()),conf, userName);break;case PARTITION:// sql std authorization is managing privileges at the table/view levels// only// ignore partitionscontinue;case COMMAND_PARAMS:case FUNCTION:// operations that have objects of type COMMAND_PARAMS, FUNCTION are authorized// solely on the typeif (privController.isUserAdmin()) {availPrivs.addPrivilege(SQLPrivTypeGrant.ADMIN_PRIV);}break;default:availPrivs = SQLAuthorizationUtils.getPrivilegesFromMetaStore(metastoreClient, userName,hiveObj, privController.getCurrentRoleNames(), privController.isUserAdmin());}// Verify that there are no missing privilegesCollection<SQLPrivTypeGrant> missingPriv = requiredPrivs.findMissingPrivs(availPrivs);SQLAuthorizationUtils.addMissingPrivMsg(missingPriv, hiveObj, deniedMessages);}}

12行RequiredPrivileges requiredPrivs = Operation2Privilege.getRequiredPrivs(hiveOpType, hiveObj, ioType);这里就发现了之前修改源码的Operation2Privilege类,而且Operation2Privilege也只在这个地方调用。至此庆幸问题不算很复杂,只要把这三个类抽出来,然后把Operation2Privilege按照需要的需求改一下权限就好了。Operation2Privilege的修改见前一篇文章hive SQL Standard Based Hive Authorization 权限自定义

修改

最后结构就是这样的

这里其实只有一个Operation2PrivilegeCustomer是要按照需求修改代码的,另外的SQLStdHiveAuthorizerFactoryCustomerSQLStdHiveAuthorizationValidatorCustomer代码与原始代码一致,只是里面的涉及到的SQLStdHiveAuthorizationValidatorOperation2Privilege全要换成我们带Customer的类了。

PS:由于原来的一些调用方法是protect的,所以这里的包路径要跟原来的包路径一致才不会出问题。

配置

修改好了之后自然是打一个包,然后把这个包的上传到hiveserver2服务器上,然后修改hive-site.xml 的

<property><name>hive.aux.jars.path</name><value>file:///my/aux/path/hive-authorizer.jar</value>
</property>

以及修改hiveserver2-site.xml的

<property><name>hive.security.authorization.manager</name><value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactoryCustomer</value><description>the hive client authorization manager class name.</description>
</property>

修改为自己重写的类 然后重启一下hiveserver2就可以了,这样的话,hive更新版本,是要拷贝配置文件和该jar包就可以了,无需修改源码重新编译,也降低了耦合性。

转载于:https://my.oschina.net/OttoWu/blog/853649

hive SQL Standard Based Hive Authorization 权限自定义(二)相关推荐

  1. Hive SQL 监控系统 - Hive Falcon

    1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务.在编写 Hive SQ ...

  2. beeline执行sql语句_由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考...

    背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的We ...

  3. (超长文)Hive Sql基本操作

    Hive Sql基本操作 1.hive里面不显示列名 2.注释问题2.1 MySQL中的注释2.2 Hive中的注释3.乱码问题3.1 修改表字段注解和表注解3.2 修改分区字段注解3.3 修改索引注 ...

  4. Hive SQL操作与函数自定义(二)

    9 Operators and UDFs 9.1 内置运算符 9.1.1 关系运算符 操作符 运算对象的类型 描述 A <=> B ALL 都是NULL时,返回TRUE,有一为NULL时, ...

  5. 搜狐 Hive SQL 血缘关系解析与应用

    1. 研究背景 随着企业信息化和业务的发展,数据资产日益庞大,数据仓库构建越来越复杂,在数仓构建的过程中,常遇到数据溯源困难,数据模型修改导致业务分析困难等难题,此类问题主要是由于数据血缘分析不足造成 ...

  6. 【文末有惊喜!】Hive SQL血缘关系解析与应用

    本文字数:7860字 预计阅读时间:20分钟 + 1 研究背景 随着企业信息化和业务的发展,数据资产日益庞大,数据仓库构建越来越复杂,在数仓构建的过程中,常遇到数据溯源困难,数据模型修改导致业务分析困 ...

  7. python调用spark和调用hive_Spark(Hive) SQL数据类型使用详解(Python)

    Spark SQL使用时需要有若干"表"的存在,这些"表"可以来自于Hive,也可以来自"临时表".如果"表"来自于Hi ...

  8. Hadoop Hive sql语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  9. hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)

    Hive SQL 几乎是每一位互联网分析师的必备技能,相信每一位面试过大厂的童鞋都有被面试官问到 Hive 优化问题的经历.所以掌握扎实的 HQL 基础尤为重要,既能帮分析师在日常工作中"如 ...

最新文章

  1. 在Windows下安装chromedriver
  2. java并发编程线程安全
  3. 【论文解读】基于关系感知的全局注意力
  4. Unity内实现Android APK版本更新
  5. Java编程字符逆序输出_用JAVA编写一程序:从键盘输入多个字符串到程序中,并将它们按逆序输出在屏幕上。...
  6. 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075
  7. linux下sendmail邮件系统安装操作记录
  8. mysql在jsp的导包语句_JSP+MYSQL中如何正确使用JDBC包?
  9. Python raw_input()
  10. poj 2406 Power Strings(KMP)
  11. (转帖)ConcurrentHashMap实现原理(3)
  12. 深度揭秘:微软内部爱恨纠葛
  13. risc-v 编译 linux,RISCV的linux模拟环境搭建整理和总结
  14. 六千档最强万金油?华硕无畏Pro15 2022锐龙版笔记本体验
  15. 金融计算机怎么调成链式,FRM金融计算器使用方法
  16. scp 是我小看了你---基于密钥传输!
  17. 策划的权限、视野与产品的最终高度
  18. MySQL Partition 相关使用总结
  19. java面试题:2年工作经验java简历包装,面试为什么公司不通过
  20. 大数据工程师如何实现技术成长?

热门文章

  1. java方法的重载 编程题,java面试编程题:重载方法
  2. 进程和线程不属于标准c语言,经典C语言面试题6:进程与线程的关系和区别
  3. 一加3支持android9吗,不忘老用户!一加3更新Android 9,网友:真的不将就
  4. linux更改文件属性宁静,shell /dev/null 21 ( linux空设备文件和重定向)
  5. Ubuntu ufw 取消 网关到 224.0.0.1 multicast 日志
  6. 不能使用zsh或myzsh创建/切换 包含#的分支名(zsh: bad pattern: #xxx)
  7. linux大页内存 grub,Centos7.2使用1G大页面内存
  8. asc怎么用 linux zip_linux的asc文件怎么打开
  9. c++ 使用nacos_超赞!用阿里开源的Nacos做SpringCloud注册中心真贴心...
  10. 组播vlan_【参与方式】耗时10小时编撰(下)带你轻松通关组播知识点!