环境:

CDH 5.16

Hive 1.1.0

已开启Kerberos

Hive 授权使用SQL StandardsBased Authorization模式(以下简称SSBA模式)


症状表现:

在编译好UDF的jar包之后,上传到HDFS目录。

hdfs dfs -mkdir /udf
hdfs dfs -put -f my_udf.jar /udf

以管理员用户hive,进入beeline客户端。

切换到管理员角色,执行:

set role admin;

提示成功切换角色后,执行创建自定义函数语句:

create function default.ch_cnv as 'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';

创建自定义函数报错,提示对应用在CREATE FUNCTION上的DFS_URI对象没有“管理权限”:

Error: Error while compiling statement:FAILED: HiveAccessControlException Permission denied: Principal [name=hive,type=USER] does not have following privileges for operation CREATEFUNCTION [[ADMINPRIVILEGE] on Object [type=DFS_URI, name=hdfs://nameservice1/udf/my_udf.jar]](state=42000,code=40000)

尝试带temporary创建临时函数,也是报同样的错误:

create temporary function default.ch_cnv as'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';

分析思路:

在SSBA模式下,执行某一些语句会要求对应的HDFS URI必须为rwx+所有者的权限,非常繁琐(所以从Hive 3.0.0开始,基于SSBA的方式进行授权时,对URI权限要求,进行了大幅度的修改。例如建立外表时,不再要求用户必须是HDFS目录的所有者,只需要拥有rw权限即可)。会不会是这里出了问题?

先查阅官方文档:

https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization


官方文档上清楚的显示CREATE FUNCTION操作是和HDFS URI权限完全无关的。

难道是官方文档写错了???

尝试将jar权限改为777,所属用户和组都修改为hive。

重试create function语句,没有效果,依然报同样的错误。

这条路走不通,那就试试看能不能从别的信息入手。

重新以hive身份进入beeline,不执行set role admin,就以普通的public角色身份,执行create function语句,提示:

Error: Error while compiling statement:FAILED: HiveAccessControlException Permission denied: Principal [name=hive,type=USER] does not have following privileges for operation CREATEFUNCTION [[ADMINPRIVILEGE] on Object [type=DATABASE, name=default], [ADMIN PRIVILEGE] on Object[type=DFS_URI, name=hdfs://nameservice1/udf/my_udf.jar], [ADMIN PRIVILEGE] onObject [type=FUNCTION, name=default.ch_cnv]](state=42000, code=40000)

这时可以看到,对于执行create function,要求了三个权限:

1、 数据库的admin权限
2、 HDFS URI的admin权限
3、 函数对象的admin权限

其中1和3与官方文档的描述是完全一致的。而我们set role admin之后,1和3都被满足。只有2却依然不满足,这说明并不是我们的管理员角色配置,或是管理员角色切换出现了问题。

那只剩下一种可能性,Hive的这个功能有BUG…

搜索的时候,发现了一名网友遇到了同样的问题:

http://lxw1234.com/archives/2016/01/600.htm

虽然并没有人解答这个问题,但至少说明这并非奇特的个案。

来到Apache的官方JIRA,进行搜索。果然有相关的BUG报告:

https://issues.apache.org/jira/browse/HIVE-11175

从描述和提交的补丁来看,是Hive在SSBA模式下进行create function的语义分析时,错误的将一个输入型资源(UDF的JAR包),当作了输出型资源。要求对该路径施加写的管理员权限(实际应当为要求读的权限),一个已经存在的输入型资源是只读的,于是导致永远卡死在这个验证上。


解决方法:

由于已经对Hive集群实施了SSBA模式,所以我们肯定是不可能为了装载一个UDF函数,就去临时将集群的验证关闭的。彻底关闭会有一段时间暴漏在安全风险中,并且还需要重启服务,临时关闭需要重启一次,开启又要重启一次,这会非常麻烦。

另外一种方式就是去应用前面社区中提交的补丁到源码重新编译,然后替换有问题的JAR包。这个补丁目前还没被集成到Hive的主线中,这么做存在一定风险。而且目前这个集群是客户购买的商业版的CDH,也不太建议自己去弄。

怎么办?这个时候就要请最老旧的Hive CLI上场了!

Hive CLI正是由于不兼容完备的授权模式(Sentry/Ranger/SSBA),可以绕过这些安全限制,所以被官方用beeline给代替了,只在Hive3之前的版本,作为一个兼容性功能保留。


所以一旦开启了Hive授权,都是建议对普通用户禁用Hive CLI的(除非你有Spark多租户的需求,否则都会进行下面的HMS代理禁用)。最常见的禁用手段,就是通过配置Hive的hadoop.proxyuser.hive.groups(Hive Metastore 访问控制和代理用户组覆盖),指定值由 * 改为具体的管理员组,使得普通用户就算进入Hive CLI,也无法操作,但是管理员组用户依然可以进入Hive CLI操作。


所以我们可以使用hive管理员用户,直接进入Hive CLI,绕过SSBA的验证过程,来创建UDF函数:

kinit -k -t hive.keytab hive@XXX.COM
hive

进入Hive CLI后,执行:

create function default.ch_cnv as 'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';

提示创建成功!

切换到beeline,试用带UDF函数的HQL语句,没有问题。搞定!


Hive在SQL标准权限模式下创建UDF失败的问题排查相关推荐

  1. php读写w,PHP如何在读写(w +)模式下创建临时文件?,_PHP_ 少侠科技

    详细内容 PHP中的tmpfile()函数是一个内置函数,用于在读写(w+)模式下创建一个具有唯一名称的临时文件. 使用tmpfile()函数创建的文件在使用fclose()关闭或没有对文件句柄的剩余 ...

  2. 学习OceanBase :如何在MySQL模式下创建一个用户?

    本节主要介绍如何创建一个用户. 谁可以创建用户 数据库在运行过程中,往往需要创建不同的用户,并为用户赋予相应的权限,一般被授予 CREATE USER 权限的用户可以创建用户. 由于 CREATE U ...

  3. 一次kubenetes的rook-ceph创建pv失败的故障排查

    kubenetes基于rook-ceph创建pv失败的一次故障排除 1.本次问题出现,新创建statefulset的pod无法正常创建pv Events:Type Reason Age From Me ...

  4. 安卓adb shell模式下创建文件夹出现Permission denied时的解决办法

    进入一个安卓模拟器的adb shell命令模式后使用如下方法创建文件夹 generic_x86_arm:/ # mkdir /data/data/com.example.waibucunchu/dat ...

  5. mysql命令创建模式_mysql在命令行模式下创建数据库时要显式指定字符集

    关于log4j的讨论 1.LoggersLoggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < ...

  6. Unity3d编辑器模式下创建和替换Prefab

    最近在项目中需要开发一套地图数据生成编辑器,记录自己在这个过程中使用的一些好用的创建和替换Prefab的方法. PrefabUtility.CreatePrefab(localPath,obj) 这个 ...

  7. 解决pig在MapReduce模式下执行任务失败,提示Failed to read data的问题

    在运行pig的pig -x mapreduce 时,总是在load的时候失败,提示Failed to read data from "hdfs://ip:port/XXXX"↓ 尝 ...

  8. 虚拟机桥接模式下连接网络失败解决

    虚拟机设置使用了静态ip,ip,网关,子网掩码都没有问题,死活上不了网 主机的ip情况 虚拟机的设置 也重启了网卡服务等,就是无法上网.后面,查阅资料,在参考资料1中,能够解决基本问题,但是主机能够p ...

  9. 理解SQL Server中的权限体系(下)----安全对象和权限

    在开始阅读本文之前,请确保你已经阅读过上一篇文章,文章地址: 理解SQL Server中的权限体系(上)----主体 简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安 ...

最新文章

  1. Linux驱动开发环境配置(内核源码树构造)
  2. CentOS 7 Root用户密码重置 2017-04-02
  3. 多亏我缓存技术过硬!疫情防控项目上线,我只用了5天!
  4. yolov3之pytorch源码解析_springmvc源码架构解析之view
  5. Arm华为NXP睿赛德大咖云集!2020中国嵌入式技术大会嘉宾揭晓
  6. 谷歌地球怎么用不了_谷歌地球怎么用
  7. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
  8. php调用第三方的api,PHP接口编程——调用第三方接口获取天气
  9. GO实例3 Slice append打印
  10. ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation(自动驾驶领域轻量级模型)
  11. 《企业软件交付:敏捷与高效管理精要》——2.5 项目执行结果
  12. 云计算大佬必看|IDC主机销售管理系统详细对比评测
  13. 使用RNN预测各个国家的人均GDP
  14. 一个猫下面的计算机互相访问,光猫连接路由器和电脑如何互相访问
  15. Gephi实战教程:从入门到精通
  16. hbase日志报java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder的错
  17. 音乐欣赏之古典乐曲经典开头
  18. 无线路由器磊科NW711做WiFi信号中继器
  19. mysql中一条update的执行过程
  20. 安卓查看wifi密码

热门文章

  1. Linux内核编程(二)-----------Linux内核初探
  2. 生物信息学有哪些SCI期刊推荐? - 易智编译EaseEditing
  3. List集合转换成Json字符串
  4. php封装多段mp4,解决ffmpeg将多段视频裁剪拼接后卡顿现象
  5. 【第35期】游戏策划:要参加策划培训班吗?
  6. 【centos7上装向日葵linux命令行版(先把结果交代在这:ssh远控功能收费。最后一步当我在向日葵使用ssh远程centos7时,发现它是收费的,我离完整体验就差9块钱)】
  7. 【前端】CSS中的相对定位,绝对定位和固定定位
  8. curl进行REST服务请求
  9. 浅谈Python代码风格规范 PEP8
  10. 脉冲触发的触发器(主从触发器)