前言

在关联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相关推荐

  1. cdh的hive配置文件位置_CDH6配置 Atlas,及 Hive Hook

    因为 CDH 社区版不能使用 Navigator,所以需要自己集成一个Apache Atlas. 版本说明 20200818 Updated: 目前最新版是2.1.0,如果 Hive 版本是3.1一下 ...

  2. Atlas配置Hive Hook

    Atlas配置Hive Hook 配置hive-site.xml 在Hive客户端$HIVE_HOME/conf/hive-site.xml中加入内容: <property><nam ...

  3. 自定义hive url parse函数

    在用hive做nginx日志url 分析的时候,经常需要parse url. hive中自带的函数parse_url可以实现这个功能,不过它对格式的要求比较严格,不能直接用于nginx log的req ...

  4. 比萨饼划分算法_制作更好的比萨饼图

    比萨饼划分算法 While flipping through a magazine on the weekend, I saw this pizza pie chart. Yes, the pizza ...

  5. hive内置函数_Hive Query生命周期 —— 钩子(Hook)函数篇

    无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...

  6. 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 ...

  7. Hive自定义函数(字母大小写转换)

    自定义Hive的函数,首先需要继承UDF类,然后定义方法名字为evaluate的方法,该方法不能设置void,如果需要返回为空,可以返回为null. 一个简单的大小写转换案例 特别注意看注释 pack ...

  8. Hive自定义分区器流程

    Hive自定义分区器流程 1. 环境说明 当前环境采用Hadoop3.1.3以及Hive3.1.2版本! 2. 自定义类 自定义类实现org.apache.hadoop.mapred.Partitio ...

  9. React之Hook(六)——自定义 Hook

    通过自定义 Hook,可以将组件逻辑提取到可重用的函数中. 在我们学习使用 Effect Hook 时,我们已经见过这个聊天程序中的组件,该组件用于显示好友的在线状态: import React, { ...

最新文章

  1. 通过css类/选择器选取元素 文档结构和遍历 元素树的文档
  2. android studio修改项目包名
  3. 【推荐】极简数独1.0源码
  4. 【机器视觉】 reset_fuzzy_measure算子
  5. 算术运算符_加号的多种用法
  6. LiveVideoStackCon 2019北京 优秀出品人与讲师
  7. 【MyBatis框架】订单商品数据模型-分析思路
  8. webpack 4.0 配置方法以及错误解决
  9. 小白教程 微信小程序 官方示例Demo下载及运行
  10. 电竞帮服务器未响应,电竞显示器ips面板1ms响应时间?被蒙骗是因为你还不了解MPRT技术!...
  11. RPG Maker MZ如何导入dlc素材?
  12. 15个免费好用的抓包工具
  13. 技术团队培养_如何在团队中培养伟大的文化
  14. 弗洛伊德篇-梦的解析
  15. Golang 的 mgo 连接池
  16. 必看的十大黑客电影,你看了几部?
  17. 问卷设计及问卷调查中的问题与技巧
  18. 把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试回顾
  19. RAD Studio 安装之后出现“配置系统未能初始化“
  20. 图像超分辨率重建之SRCNN

热门文章

  1. 成长与发展---制定和实现职业目标的方法
  2. 会考计算机成绩查询入口官网,2019会考成绩查询网址入口 高中会考怎么查成绩...
  3. app小程序手机端Python爬虫实战13-fiddler如何抓取手机端数据包
  4. APP测试:测试流程及常规测试内容
  5. 2020二级c语言成绩查询入口,2020年全国计算机等级考试一本通 二级C语言
  6. 24英寸iMac是否比27英寸iMac更好?
  7. linux静默状态如何安装软件_Linux下实现软件的静默安装 debconf
  8. 云南省铁路桥梁检测公司
  9. 计算机毕业论文java毕业设计选题基于javaweb的停车场收费管理系统[包运行成功]
  10. 新华网:软件工程师职业前景、薪水报酬及地位分析