0897-7.1.7-CDP中如何通过Ranger为UDF授权

2022-10-10 14:41:43 浏览数 (1)

1.文档编写目的

本片文档主要讲述了在Ranger中对Hive的UDF函数进行授权的方式。分别测试了对HDFS上和本地的UDF的授权。

  • 测试环境
    • CDP7.1.7,集群启用了Kerberos
    • 使用一个普通用户liuyq测试,该用户有udf_test库的权限

2.HDFS上的UDF JAR授权

2.1.准备工作

1.将UDF的 jar包上传至HDFS的/user/hive/udf目录下,用于测试HDFS上的UDF授权

代码语言:javascript复制
hdfs dfs -mkdir /user/hive/udfhdfs dfs -put hiveudf.jar /user/hive/udfhdfs dfs -ls /user/hive/udf/

2.准备一张表udf_test.students用于测试UDF是否可用

2.2.永久UDF授权

1.在Ranger中进行授权

在cm_hdfs里授权用户有UDF路径/user/hive/udf/hiveudf.jar的RWX权限,cm_hive里授权udf_test库所有udf 的CREATE、SELECT、DROP权限

2.在Hive中注册UDF函数

代码语言:javascript复制
USE udf_test;
create function TypeOf as "com.mycompany.hiveudf.TypeOf" USING JAR 'hdfs:///user/hive/udf/hiveudf.jar';

3.在Hive中使用UDF

代码语言:javascript复制
SELECT students.name, typeof(students.name) AS type FROM students WHERE age=35;

2.3.临时UDF授权

1.在Ranger中进行授权

在cm_hdfs里授权用户有UDF路径/user/hive/udf/hiveudf.jar的RWX权限,同时在cm_hive的all-global策略中设置用户具有“Temporary UDF Admin”权限

2.在Hue中注册临时UDF

代码语言:javascript复制
USE udf_test;create temporary function TypeOf as "com.mycompany.hiveudf.TypeOf" USING JAR 'hdfs:///user/hive/udf/hiveudf.jar';

3.在Hive中使用UDF

代码语言:javascript复制
SELECT students.name, typeof(students.name) AS type FROM students WHERE age=35;

3.本地的UDF JAR授权

3.1.准备工作

1.在所有HMS、HS2节点创建/opt/udf目录,将UDF的jar包放置到该目录下,用于测试本地的UDF 授权

2.在Hive和Hive on Tez服务中的配置中将“Hive Auxiliary JARs Directory”配置为“/opt/udf”

3.重启Hive、Hive on Tez服务及相关依赖服务

3.2.永久UDF授权

1.在Ranger中进行授权

在cm_hive中授权用户有udf_test库所有udf 的CREATE、SELECT、DROP权限

2.在Hive中注册UDF函数

代码语言:javascript复制
USE udf_test;create function TypeOf as "com.mycompany.hiveudf.TypeOf";

3.在Hive中使用UDF函数

代码语言:javascript复制
SELECT students.name, typeof(students.name) AS type FROM students WHERE age=35;

3.3.临时UDF授权

1.在Ranger中进行授权

在cm_hive的all-global策略授权用户有“Temporary UDF Admin”权限

2.在Hive中注册临时UDF函数

代码语言:javascript复制
USE udf_test;create temporary function TypeOf as "com.mycompany.hiveudf.TypeOf";

3.在Hive中使用UDF

代码语言:javascript复制
SELECT students.name, typeof(students.name) AS type FROM students WHERE age=35;

4.授权中的常见问题分析

1.注册永久函数时

若报错

代码语言:javascript复制
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [liuyq] does not have [CREATE] privilege on [udf_test/typeof]

则说明用户缺少Hive库的UDF CREATE权限,需要在cm_hive中授权用户有对应Hive库的UDF CREATE权限

若报错

代码语言:javascript复制
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [liuyq] does not have [ALL] privilege on [hdfs://nameservice1/user/hive/udf/hiveudf.jar]

则说明用户缺少HDFS JAR包路径的权限,需要在cm_hdfs中授权用户有对应HDFS JAR包路径的ALL权限

2.注册临时函数

若报错

代码语言:javascript复制
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [liuyq] does not have [TEMPUDFADMIN] privilege on [typeof]

则需要在cm_hive中的all-global策略中添加用户有“Temporary UDF Admin”权限

3.使用UDF函数时

如报错

代码语言:javascript复制
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [liuyq] does not have [SELECT] privilege on [udf_test/typeof]

则需要在cm_hive中授权用户有对应Hive库的UDF SELECT权限。

5.总结

1.执行CREATE FUNCTION动作时,对于HDFS上的UDF JAR包,用户需要有相应HDFS JAR路径的ALL权限和Hive库的UDF CREATE权限;对于本地的UDF JAR包,需要授权用户有Hive库的UDF CREATE权限;如果要使用UDF 函数,则要有Hive库的UDF SELECT 权限。

2.执行CREATE TEMPORARY FUNCTION创建临时函数时,对于HDFS上的UDF JAR包,用户需要有相应HDFS JAR路径的ALL权限,还需要在cm_hive中的“all-global”策略中设置用户有“Temporary UDF Admin”权限;对于本地的UDF JAR包,只需在cm_hive中的“all-global”策略中设置用户有“Temporary UDF Admin”权限

0 人点赞