自定义 Hive Hook
前言
在关联hive SQL时,yarn application有多个与其对应,所以需要划分二者对应关系。通过开启hive seesion,解析hive session日志,来解析 hive sql 于hive job[即yarn application]的对应关系
hive hook
hook类型
- PreExecute and PostExecute: 扩展Hook接口,用于 hive SQL执行之前,执行之后的操作处理
- ExecuteWithHookContext :扩展Hook接口,通过HookContext,包含所有hook实现类要用的信息.HookContext会被传递给所有带"WithContext"的Hook类
- HiveDriverRunHook ,扩展 Hook类,在hive jdbc driver运行时允许自定义的逻辑处理程序处理
- HiveSemanticAnalyzerHook,扩展 Hook类,允许可插拔的自定义SQL语义分析逻辑组件。通过preAnalyze(),postAnalyze()方法,在hive执行之前和之后进行语义分析
- HiveSessionHook ,扩展 Hook类,提供session级别hook,会在一个新的session启动时调用,通过hive.server2.session.hook配置
hive 现成的hook 例子
- DriverTestHook, 打印hive执行的SQL命令
- PreExecutePrinter and PostExecutePrinter : hive执行之前和之后时进行打印hive执行相关参数的hook类
- ATSHook, 是个ExecuteWithHookContext,推送query和plan信息到YARN timeline server
- EnforceReadOnlyTables, 是个ExecuteWithHookContext,阻止对只读表的修改
- LineageLogger ,是个ExecuteWithHookContext,打印血缘信息到日志文件,血缘信息保护所有的查询血缘
- PostExecOrcFileDump 后执行hook,打印ORC file信息
- PostExecTezSummaryPrinter 后执行hook,打印Tez 计数器的相关描述
- UpdateInputAccessTimeHook 预执行hook,在访问hive 输入表之前[即允许查询SQL]更新输入表访问信息
开发流程
配置依赖
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>2.1.1</version></dependency> <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>2.1.1</version></dependency>
代码
package com.wacai.stanlee.hook;import org.apache.commons.lang.CharEncoding;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.QueryPlan;
import org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext;
import org.apache.hadoop.hive.ql.hooks.HookContext;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JcRestHook implements ExecuteWithHookContext {private static Logger logger = LoggerFactory.getLogger(JcRestHook.class);public void run(HookContext hookContext) throws Exception {//获取查询计划QueryPlan queryPlan = hookContext.getQueryPlan();HiveConf conf = hookContext.getConf();String queryId = queryPlan.getQueryId();if(StringUtils.isEmpty(queryId)){logger.warn("queryId is null or empty,return");}logger.info("queryId: "+queryId);//获取query string(sql)String queryStr = URLEncoder.encode(queryPlan.getQueryStr(), CharEncoding.UTF_8);logger.info("queryStr: "+queryStr);//获取hadoopJobName//String jobName = conf.getVar(HiveConf.ConfVars.HADOOPJOBNAME);String jobName = conf.getVar(HiveConf.ConfVars.HIVEQUERYNAME);//logger.info("jobName: "+jobName);//获取hiveserver hookString server = conf.getAllProperties().getProperty("hiveserver2.execute.hook.server");if(StringUtils.isEmpty(server)){logger.warn("server is null or empty,return");return;}logger.info("server: "+server);String rest = conf.getAllProperties().getProperty("hiveserver2.execute.hook.rest");logger.info("rest: "+rest);if(StringUtils.isEmpty(rest)){logger.warn("rest is null or empty,return");return;}Map<String,String> params = new HashMap<String, String>();params.put("server",server);params.put("hook",hookContext.getHookType().toString());params.put("queryId",queryId);params.put("queryStr",queryStr);//确定是否获取的hadoopJobName,applicationNameparams.put("jobName",jobName);params.put("datetime",String.valueOf(new Date().getTime()));params.put("histFileName", SessionState.get().getHiveHistory().getHistFileName());}
}
打包后,放置到hive auxlib目录,或进行加载
设置hive-site.xml参数,重启hive服务
- hive-site.xml
<property><name>hive.session.history.enabled</name><value>true</value><description>hive session for hive hook</description></property><property><name>hive.exec.pre.hooks</name>
<value>com.wacai.stanlee.prototype.UpdateInputAccessTimeHook$PreExec</value><description>update operations of last access time for hive metastor </description></property><property><name>hive.exec.post.hooks</name>
<value>com.wacai.stanlee.hivehook.GetTbOwnerHook,com.wacai.stanlee.prototype.HqlLinageHook</value></property><property>
引用文章
- http://dharmeshkakadia.github.io/hive-hook/
- https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/hooks/PostExecutePrinter.java
- https://www.cnblogs.com/smartloli/p/5928919.html
- demigelemiao https://www.cnblogs.com/yurunmiao/p/4224137.html
自定义 Hive Hook相关推荐
- cdh的hive配置文件位置_CDH6配置 Atlas,及 Hive Hook
因为 CDH 社区版不能使用 Navigator,所以需要自己集成一个Apache Atlas. 版本说明 20200818 Updated: 目前最新版是2.1.0,如果 Hive 版本是3.1一下 ...
- Atlas配置Hive Hook
Atlas配置Hive Hook 配置hive-site.xml 在Hive客户端$HIVE_HOME/conf/hive-site.xml中加入内容: <property><nam ...
- 自定义hive url parse函数
在用hive做nginx日志url 分析的时候,经常需要parse url. hive中自带的函数parse_url可以实现这个功能,不过它对格式的要求比较严格,不能直接用于nginx log的req ...
- 比萨饼划分算法_制作更好的比萨饼图
比萨饼划分算法 While flipping through a magazine on the weekend, I saw this pizza pie chart. Yes, the pizza ...
- hive内置函数_Hive Query生命周期 —— 钩子(Hook)函数篇
无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...
- hive 解密_hive 中自定义 base64 加密 解密 UDF 函数
一.maven依赖 org.apache.hadoop hadoop-client 2.7.3 org.apache.hive hive-exec 1.2.1 org.apache.maven.plu ...
- Hive自定义函数(字母大小写转换)
自定义Hive的函数,首先需要继承UDF类,然后定义方法名字为evaluate的方法,该方法不能设置void,如果需要返回为空,可以返回为null. 一个简单的大小写转换案例 特别注意看注释 pack ...
- Hive自定义分区器流程
Hive自定义分区器流程 1. 环境说明 当前环境采用Hadoop3.1.3以及Hive3.1.2版本! 2. 自定义类 自定义类实现org.apache.hadoop.mapred.Partitio ...
- React之Hook(六)——自定义 Hook
通过自定义 Hook,可以将组件逻辑提取到可重用的函数中. 在我们学习使用 Effect Hook 时,我们已经见过这个聊天程序中的组件,该组件用于显示好友的在线状态: import React, { ...
最新文章
- 通过css类/选择器选取元素 文档结构和遍历 元素树的文档
- android studio修改项目包名
- 【推荐】极简数独1.0源码
- 【机器视觉】 reset_fuzzy_measure算子
- 算术运算符_加号的多种用法
- LiveVideoStackCon 2019北京 优秀出品人与讲师
- 【MyBatis框架】订单商品数据模型-分析思路
- webpack 4.0 配置方法以及错误解决
- 小白教程 微信小程序 官方示例Demo下载及运行
- 电竞帮服务器未响应,电竞显示器ips面板1ms响应时间?被蒙骗是因为你还不了解MPRT技术!...
- RPG Maker MZ如何导入dlc素材?
- 15个免费好用的抓包工具
- 技术团队培养_如何在团队中培养伟大的文化
- 弗洛伊德篇-梦的解析
- Golang 的 mgo 连接池
- 必看的十大黑客电影,你看了几部?
- 问卷设计及问卷调查中的问题与技巧
- 把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试回顾
- RAD Studio 安装之后出现“配置系统未能初始化“
- 图像超分辨率重建之SRCNN
热门文章
- 成长与发展---制定和实现职业目标的方法
- 会考计算机成绩查询入口官网,2019会考成绩查询网址入口 高中会考怎么查成绩...
- app小程序手机端Python爬虫实战13-fiddler如何抓取手机端数据包
- APP测试:测试流程及常规测试内容
- 2020二级c语言成绩查询入口,2020年全国计算机等级考试一本通 二级C语言
- 24英寸iMac是否比27英寸iMac更好?
- linux静默状态如何安装软件_Linux下实现软件的静默安装 debconf
- 云南省铁路桥梁检测公司
- 计算机毕业论文java毕业设计选题基于javaweb的停车场收费管理系统[包运行成功]
- 新华网:软件工程师职业前景、薪水报酬及地位分析