如何在启用Sentry的CDH集群中使用UDF
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
1.文档编写目的
在前面的文章Fayson介绍过UDF的开发及使用《如何在Hive&Impala中使用UDF》,大多数企业在使用CDH集群时,考虑数据的安全性会在集群中启用Sentry服务,这样就会导致之前正常使用的UDF函数无法正常使用。本篇文章主要讲述如何在Sentry环境下使用自定义UDF函数。
- 文章概述
1.部署UDF JAR文件
2.Hive配置
3.授权JAR文件
4.创建临时函数
5.创建永久函数
- 测试环境
1.CM和CDH版本为5.11.2
2.采用sudo权限的ec2-user用户
- 前置条件
1.集群Kerberos已启用
2.集群已安装Sentry服务且正常使用
2.部署UDF JAR包
1.将开发好的UDF JAR包上传至HServer2及Metastore服务所在服务器统一目录
[ec2-user@ip-172-31-22-86 ~]$ sudo mkdir /usr/lib/hive-udf-jars
[ec2-user@ip-172-31-22-86 ~]$ sudo scp sql-udf-utils-1.0-SNAPSHOT.jar /usr/lib/hive-udf-jars/
[ec2-user@ip-172-31-22-86 ~]$ ll /usr/lib/hive-udf-jars/
total 4
-rwxr-xr-x 1 root root 2518 Nov 1 03:37 sql-udf-utils-1.0-SNAPSHOT.jar
[ec2-user@ip-172-31-22-86 ~]$ sudo chown -R hive:hive /usr/lib/hive-udf-jars
[ec2-user@ip-172-31-22-86 ~]$ ll /usr/lib/hive-udf-jars/
total 4
-rwxr-xr-x 1 hive hive 2518 Nov 1 03:37 sql-udf-utils-1.0-SNAPSHOT.jar
[ec2-user@ip-172-31-22-86 ~]$
注意:/usr/lib/hive-udf-jars目录及目录下文件的属主为hive,确保hive用户能访问
2.将开发好的UDF JAR上传至HDFS
[ec2-user@ip-172-31-22-86 ~]$ hadoop fs -ls /user/hive/udfjars
Found 1 items
-rw-r--r-- 3 hive hive 2518 2017-11-01 03:49 /user/hive/udfjars/sql-udf-utils-1.0-SNAPSHOT.jar
[ec2-user@ip-172-31-22-86 ~]$
注意:/user/hive/udfjars和jar文件的所属用户必须为hive
3.Hive配置
1.登录CM管理控制台,进入Hive服务
点击配置,选择高级配置,在hive-site.xml文件中增加如下配置
<property>
<name>hive.reloadable.aux.jars.path</name>
<value>/usr/lib/hive-udf-jars</value>
</property>
注意:hive.reloadable.aux.jars.path路径为本地的/usr/lib/hive-udf-jars目录
2.保存配置,回到CM主页根据提示重启Hive服务
4.授权JAR文件
1.使用hive用户登录Hue管理台进行授权
2.进入Hive Tables管理页面,为admin角色增加授权
5.创建临时函数
1.通过beeline通过使用hive用户登录HiveServer2测试
[root@ip-172-31-22-86 ec2-user]# beeline
Beeline version 1.1.0-cdh5.11.2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/;principal=hive/ip-172-31-22-86.ap-southeast-1.compute.internal@CLOUDERA.COM
scan complete in 2ms
...
0: jdbc:hive2://localhost:10000/> SELECT parse_date('2017-9-12 5:8:23', "yyyy-MM-dd HH:mm:ss")
. . . . . . . . . . . . . . . . > ;
Error: Error while compiling statement: FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'parse_date' (state=42000,code=10011)
0: jdbc:hive2://localhost:10000/>
0: jdbc:hive2://localhost:10000/>
0: jdbc:hive2://localhost:10000/>
0: jdbc:hive2://localhost:10000/> create temporary function parse_date as 'com.peach.date.DateUtils';
...
INFO : OK
No rows affected (0.154 seconds)
0: jdbc:hive2://localhost:10000/> SELECT parse_date('2017-9-12 5:8:23', "yyyy-MM-dd HH:mm:ss")
. . . . . . . . . . . . . . . . > ;
...
INFO : OK
+----------------------+--+
| _c0 |
+----------------------+--+
| 2017-09-12 05:08:23 |
+----------------------+--+
1 row selected (0.229 seconds)
0: jdbc:hive2://localhost:10000/>
2.退出再次使用beeline登录
[root@ip-172-31-22-86 ec2-user]# beeline
Beeline version 1.1.0-cdh5.11.2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/;principal=hive/ip-172-31-22-86.ap-southeast-1.compute.internal@CLOUDERA.COM
…
0: jdbc:hive2://localhost:10000/> SELECT parse_date('2017-9-12 5:8:23', "yyyy-MM-dd HH:mm:ss");
Error: Error while compiling statement: FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'parse_date' (state=42000,code=10011)
0: jdbc:hive2://localhost:10000/>
再次登录临时函数parse_date已不存在。
6.创建永久函数
1.使用hive用户登录Hue,在tpcds_text库下创建parse_date函数
CREATE FUNCTION parse_date as 'com.peach.date.DateUtils'
2.测试parse_date函数是否正常
7.Impala使用Hive的自定义UDF
1.在Impala shell命令行创建函数
[ip-172-31-26-80.ap-southeast-1.compute.internal:21000] > create function parse_date2(string, string) returns string location '/user/hive/udfjars/sql-udf-utils-1.0-SNAPSHOT.jar' symbol='com.peach.date.DateUtils';
Query: create function parse_date2(string, string) returns string location '/user/hive/udfjars/sql-udf-utils-1.0-SNAPSHOT.jar' symbol='com.peach.date.DateUtils'
Fetched 0 row(s) in 0.03s
[ip-172-31-26-80.ap-southeast-1.compute.internal:21000] >
2.使用UDF函数
[ip-172-31-26-80.ap-southeast-1.compute.internal:21000] > SELECT parse_date2('2017-9-12 5:8:23', "yyyy-MM-dd HH:mm:ss");
Query: select parse_date2('2017-9-12 5:8:23', "yyyy-MM-dd HH:mm:ss")
Query submitted at: 2017-11-01 08:58:54 (Coordinator: http://ip-172-31-26-80.ap-southeast-1.compute.internal:25000)
Query progress can be monitored at: http://ip-172-31-26-80.ap-southeast-1.compute.internal:25000/query_plan?query_id=154799fb3ae4df01:3032775a00000000
+-------------------------------------------------------------------+
| tpcds_text.parse_date2('2017-9-12 5:8:23', 'yyyy-mm-dd hh:mm:ss') |
+-------------------------------------------------------------------+
| 2017-09-12 05:08:23 |
+-------------------------------------------------------------------+
Fetched 1 row(s) in 0.03s
[ip-172-31-26-80.ap-southeast-1.compute.internal:21000] >
8.总结
- 在集群启用了Sentry后,使用Hive创建Function是不能使用USING JAR,所以在加载jar包时只能通过配置hive.reloadable.aux.jars.path路径。
- 创建的临时函数只能在当前会话使用,如果会话关闭则临时函数失效,使用Hue创建的临时函数在退出账号重新登录任然可以使用,重启HiveServer2则临时函数失效。
- 集群启用了Sentry服务,Hive创建函数时指定的是本地的jars,导致在Impala中无法直接使用Hive的函数,需要在Impala shell下重新创建。
另外需要注意:
1.Hive
- 为用户授权JAR文件的GRANT ALL ON URI特权,则用户就可以在他们拥有写权限的数据库上创建Function(即使用户没有GRANT ALL ON SERVER权限)
- 任何用户都可以DROP掉任何Function,不管它有什么权限,即使这个用户没有这个数据库的权限,也可以DROP掉这个数据库下的Function,只要带上Function的全路径,如:
DROP FUNCTION dbname.funcname
- 任何用户都可以使用创建好的Function,不管这个用户的权限,即使这个用户没有这个数据库的权限,只要带上function的全路径,就可以使用,如:
SELECT dbname.funcname()
2.Impala
- 只有拥有GRANT ALL ON SERVER权限的用户才能CREATE/DROP函数。
- 任何用户都可以使用创建好的Function,不管这个用户的权限,即使这个用户没有这个数据库的权限,只要带上function的全路径,就可以使用,如:
SELECT dbname.funcname()
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操
- 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
- No.013 Roman to Integer
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
- Java实现的手工做乘法方法,给出二个字符串数字,返回相乘结果
- No.012 Integer to Roman
- 黑帽SEO剖析之手法篇
- IOS学习1——IOS应用程序的生命周期及基本架构
- 浅议“全局变量”、“多线程”和“编译器陷阱”
- Java实现的图片合并方法,支持水平和垂直合并
- OC学习15——文件I/O体系
- 用惯了ORM,居然不会写分页SQL了
- OC学习14——谓词
- 如何在32位系统中使用ROP+Return-to-dl来绕过ASLR+DEP
- 如何使用Twitter构建C;C服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501
- docker 安装mysql5.7
- php面试笔记(5)-php基础知识-自定义函数及内部函数考点
- AJAX的一个简单实例,跨域的解决,使用JQuery来进行ajax的调用
- ASP.NET Core 将文件夹内容输出为压缩包文件方法
- 如何阻止指定类型的SAP CRM附件被上传到服务器
- Docker 之NameSpace与Cgroup
- 微信网页扫码登录和公众号网页授权登录的比较
- 【TBase开源版测评】分布式数据库复制表关联查询
- v-decorator的取值与赋值
- fastjson导致spring security oauth2的token序列化错误
- 微信小程序webview,a锚点跳转,回退时一直保留在原页面
- SLURM使用教程
- MIME 类型大全,你值得收藏
- Jetbrains系列---PyCharm, Goland翻译插件推荐Translation