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授权
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函数
USE udf_test;
create function TypeOf as "com.mycompany.hiveudf.TypeOf" USING JAR 'hdfs:///user/hive/udf/hiveudf.jar';
3.在Hive中使用UDF
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
USE udf_test;create temporary function TypeOf as "com.mycompany.hiveudf.TypeOf" USING JAR 'hdfs:///user/hive/udf/hiveudf.jar';
3.在Hive中使用UDF
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函数
USE udf_test;create function TypeOf as "com.mycompany.hiveudf.TypeOf";
3.在Hive中使用UDF函数
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函数
USE udf_test;create temporary function TypeOf as "com.mycompany.hiveudf.TypeOf";
3.在Hive中使用UDF
SELECT students.name, typeof(students.name) AS type FROM students WHERE age=35;
4.授权中的常见问题分析
1.注册永久函数时
若报错
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权限
若报错
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.注册临时函数
若报错
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函数时
如报错
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”权限