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

在Hive1.1.0与CDH5.16环境下,使用SQLStandardsBasedAuthorization(SSBA)模式时,创建自定义函数(UDF)遇到权限拒绝错误。文章详细分析了问题原因,涉及HDFSURI权限、数据库及函数对象的admin权限需求,最终通过HiveCLI绕过SSBA验证成功部署UDF。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

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报告:

HIVE-11175

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语句,没有问题。搞定!


<think>我们正在处理一个关于Hive程序运行失败排查问题。根据用户需求,我们需要提供Hive程序提交后运行失败的原因分析及排查步骤。同时,我们有一些系统级指令需要遵守,包括使用正确的LaTeX格式、中文回答、生成相关问题等。首先,我们回顾一下用户的问题:用户希望了解Hive程序提交后运行失败的原因分析及排查步骤。我们有一些可用的引用:-引用[1]提到了一个SparkStreaming作业启动失败的案例,他们通过一系列排查找到了解决方案。虽然这是SparkStreaming,但排查思路可能类似。-引用[2]提到了使用EXPLAIN语法分析Hive查询的执行计划,以及性能调优方法。-引用[3]提到了Hive钩子的使用注意事项,以及钩子可能增加延迟,并且无法捕获通过Spark的HiveContext处理的信息。-引用[4]展示了一个具体的错误信息,是关于无法连接到Hive的元数据库(MySQL)的错误。用户的需求是Hive程序运行失败排查步骤,因此我们将重点放在Hive的常见错误和排查方法上。根据经验,Hive程序运行失败可能涉及多个方面,包括:1.资源问题(如YARN资源不足)2.配置问题(如Hive配置错误、元数据库连接问题)3.查询问题(如SQL语法错误、数据倾斜)4.依赖问题(如UDF未正确部署)5.权限问题(如用户没有执行权限或HDFS权限)6.元数据问题(如表不存在或分区不存在)我们将结合引用中的信息和一般经验,给出排查步骤。注意:我们需要在回答中自然地添加引用标识,例如[^1],如果引用了相关内容。下面开始组织回答:#Hive程序运行失败的原因分析及排查步骤##1.错误信息分析首先,查看Hive作业的错误日志。通常,错误日志会直接指出失败原因。常见的错误信息包括:-**语法错误**:HiveQL语句的语法错误。-**连接错误**:如引用[4]中所示的元数据库连接失败:`Unabletoopenatestconnectiontothegivendatabase`[^4]。-**权限错误**:如用户没有操作HDFS目录的权限。-**资源错误**:如YARN资源不足导致作业被杀死。##2.资源与配置检查-**YARN资源检查**:确认集群资源是否充足。可以通过YARN的WebUI查看资源使用情况。-**Hive配置检查**:检查`hive-site.xml`等配置文件,确保配置正确。特别是元数据库的连接配置(如引用[4]中的JDBC连接信息)[^4]。-**元数据库状态检查**:确保Hive的元数据库(如MySQL)服务正常运行,并且Hive能够连接。##3.查询分析-**执行计划分析**:如引用[2]所述,使用`EXPLAIN`命令分析查询的执行计划[^2]。这有助于发现查询是否复杂导致性能问题,或者是否使用了不合理的执行计划。-**数据倾斜检查**:如果作业在Reduce阶段卡住,可能是数据倾斜导致。可以通过分析数据分布来解决。##4.依赖和权限检查-**UDF检查**:如果查询中使用了自定义函数(UDF),确保UDF已正确部署到所有节点。-**权限检查**:检查作业提交用户是否有权访问涉及的HDFS路径、Hive表等。权限问题可能导致作业失败。##5.日志排查详细查看作业的日志(包括Driver日志和各个Task的日志)。在YARN中,可以通过以下命令获取日志:```bashyarnlogs-applicationId<application_id>```##6.其他工具-**Hive钩子**:如引用[3]所述,可以使用Hive钩子来捕获执行信息,但需注意钩子可能会增加延迟,且不适用于Spark的HiveContext[^3]。-**调试模式**:在Hive中设置调试模式(如`hive-hiveconfhive.root.logger=DEBUG,console`)来获取更详细的日志。##7.常见错误示例-**元数据库连接失败**:如引用[4]中的错误,需要检查数据库服务是否启动,连接字符串是否正确,以及数据库用户权限[^4]。-**ClassNotFound**:通常是由于缺少依赖JAR包,需要将JAR包添加到Hive的`auxpath`中。##总结排查步骤1.获取并分析错误日志,定位错误类型。2.检查集群资源状态和配置。3.分析查询语句,使用`EXPLAIN`查看执行计划。4.检查依赖和权限。5.根据错误类型采取针对性措施。通过以上步骤,大部分Hive作业失败问题都可以被定位和解决。§§相关问题§§1.Hive作业运行缓慢可能有哪些原因?2.如何优化Hive查询性能?3.Hive中如何处理数据倾斜问题?4.Hive的元数据库连接失败应如何解决?5.Hive作业提交后长时间处于ACCEPTED状态可能是什么原因?注意:在回答中,我们引用了[^2]、[^3]、[^4],分别对应引用[2]、[3]、[4]的内容。引用[1]的内容与SparkStreaming相关,与当前问题关联不大,因此未引用。</think>### Hive程序运行失败的原因分析及排查步骤 Hive程序提交后运行失败通常涉及资源配置、语法执行、元数据连接等问题。以下是系统化的排查步骤: #### **1. 检查基础环境与日志** - **查看YARN日志**:通过`yarn logs -applicationId <app_id>`获取详细错误堆栈。 - **检查Hive Server日志**:定位`hive-server2.log`中错误时间戳附近的异常(如权限拒绝、连接超时)。 - **验证集群状态**:确认HDFS/YARN服务正常,无资源过载(如内存溢出)。 > *示例错误*: > 引用[4]中的数据库连接失败表明元存储异常: > `Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database...`[^4] #### **2. SQL语法与执行计划分析** - **验证HiveQL语法**:使用`EXPLAIN`解析查询逻辑(如引用[2]所述)[^2]: ```sql EXPLAIN SELECT * FROM table WHERE condition; ``` - **检查数据倾斜**:观察Reduce阶段卡在99%,可能需优化`GROUP BY`或使用`skewjoin`参数。 #### **3. 元数据与配置排查** - **元存储连通性**: - 测试JDBC连接:`telnet metastore_ip 3306` - 检查`hive-site.xml`中`javax.jdo.option.ConnectionURL`配置。 - **表分区/权限**: - 确认表存在:`SHOW TABLES LIKE 'table_name'` - 验证HDFS路径权限:`hdfs dfs -ls /user/hive/warehouse` #### **4. 资源与依赖问题** - **资源不足**:调整`mapreduce.map.memory.mb`或`yarn.scheduler.maximum-allocation-mb`。 - **UDF/JAR依赖**: - 检查UDF是否注册:`CREATE FUNCTION ... AS 'class_name'` - 确认任务JAR包已上传至分布式缓存。 #### **5. 高级调试手段** - **启用Hive钩子**:如引用[3]所述,添加前置/后置执行钩子捕获信息(需注意性能开销)[^3]。 - **最小化复现**:剥离复杂查询,逐步添加组件定位故障点。 #### **典型故障树** ```mermaid graph TD A[Hive作业失败] --> B{日志分析} B -->|语法错误| C[EXPLAIN验证执行计划] B -->|资源不足| D[调整YARN配置] B -->|连接异常| E[检查元存储服务] E --> F[数据库端口/权限] B -->|数据倾斜| G[优化分区策略] ``` #### **总结步骤** 1. 定位错误日志 → 2. 验证SQL与执行计划 → 3. 检查元数据/权限 → 4. 调整资源配置 → 5. 依赖与UDF确认。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值