Hive不为人知的宝石-Hooks

 

640?wx_fmt=png

原本想祝你们节日快乐,哎,无奈浪尖还在写文章。谴责一下,那些今天不学习的人。对于今天入星球的人,今天调低了一点价格。减小了20大洋。机不可失失再也不来点击阅读原文或者扫底部二维码。html

640?wx_fmt=png

 

640?wx_fmt=pnghive概述程序员

Hive为Hadoop提供了一个SQL接口。 Hive能够被认为是一种编译器,它将SQL(严格来讲,Hive查询语言 - HQL,SQL的一种变体)转换为一组Mapreduce / Tez / Spark做业。 所以,Hive很是有助于非程序员使用Hadoop基础架构。 原来,Hive只有一个引擎,即MapReduce。 可是在最新版本中,Hive还支持Spark和Tez做为执行引擎。 这使得Hive成为探索性数据分析的绝佳工具。

apache

基于mapreduce的hive,整个架构图以下:api

640?wx_fmt=png

driver - 接收查询的组件。 该组件实现了会话句柄的概念,并提供了在JDBC / ODBC接口上的执行和获取数据的api模型。安全

编译器 - 解析查询的组件,对不一样的查询块和查询表达式进行语义分析,最终经过从metastore获取表和分区的信息生成执行计划。session

Metastore - 存储仓库中各类表和分区的全部结构信息的组件,包括列和列类型信息,读取和写入数据所需的序列化程序和反序列化程序以及存储数据的相应HDFS文件。架构

执行引擎 - 执行编译器建立的执行计划的组件。 该计划是一个stages的DAG。 执行引擎管理计划的这些不一样阶段之间的依赖关系,并在适当的系统组件上执行这些阶段。函数

640?wx_fmt=png什么是hook工具

一般,Hook是一种在处理过程当中拦截事件,消息或函数调用的机制。 Hive hooks是绑定到了Hive内部的工做机制,无需从新编译Hive。从这个意义上讲,提供了使用hive扩展和集成外部功能的能力。换句话说,Hive hadoop可用于在查询处理的各个步骤中运行/注入一些代码。根据钩子的类型,它能够在查询处理期间的不一样点调用:oop

 

Pre-execution hooks-在执行引擎执行查询以前,将调用Pre-execution hooks。请注意,这个目的是此时已经为Hive准备了一个优化的查询计划。

Post-execution hooks -在查询执行完成以后以及将结果返回给用户以前,将调用Post-execution hooks?。

Failure-execution hooks -当查询执行失败时,将调用Failure-execution hooks?。

Pre-driver-run 和post-driver-run hooks-在driver执行查询以前和以后调用Pre-driver-run 和post-driver-run hooks。

Pre-semantic-analyzer 和 Post-semantic-analyzer hooks-在Hive在查询字符串上运行语义分析器以前和以后调用Pre-semantic-analyzer 和Post-semantic-analyzer hooks。

 

640?wx_fmt=pnghive查询的生命周期

hive查询在hive中的执行过程。

640?wx_fmt=pngHive Hook API

Hive支持许多不一样类型的Hook。 Hook接口是Hive中全部Hook的父接口。它是一个空接口,并经过如下特定hook的接口进行了扩展:

1. PreExecute和PostExecute将Hook接口扩展到Pre和Post执行hook。

2.?ExecuteWithHookContext扩展Hook接口以将HookContext传递给hook。HookContext包含了hook可使用的全部信息。 HookContext被传递给名称中包含“WithContext”的全部钩子。

3.?HiveDriverRunHook扩展了Hook接口,在driver阶段运行,容许在Hive中自定义逻辑处理命令。

4.?HiveSemanticAnalyzerHook扩展了Hook接口,容许插入自定义逻辑以进行查询的语义分析。它具备preAnalyze()和postAnalyze()方法,这些方法在Hive执行本身的语义分析以前和以后执行。

5.?HiveSessionHook扩展了Hook接口以提供会话级hook。在启动新会话时调用hook。用hive.server2.session.hook配置它。

6.?Hive 1.1添加了Query Redactor Hooks。它是一个抽象类,它实现了Hook接口,能够在将查询放入job.xml以前删除有关查询的敏感信息。能够经过设置hive.exec.query.redactor.hooks属性来配置此hook。

640?wx_fmt=png栗子搞起

 

hive源码中实现了一些hook,具体有如下几个例子:

1.driverTestHook是一个很是简单的HiveDriverRunHook,它打印你用于输出的命令。

2.?PreExecutePrinter和PostExecutePrinter是pre 和 post hook的示例,它将参数打印到输出。

3.?ATSHook是一个ExecuteWithHookContext,它将查询和计划信息推送到YARN timeline server。

4.?EnforceReadOnlyTables是一个ExecuteWithHookContext,用于阻止修改只读表。

5.?LineageLogger是一个ExecuteWithHookContext,它将查询的血统信息记录到日志文件中。 LineageInfo包含有关query血统的全部信息。

6.?PostExecOrcFileDump是一个post=Execution hook,用于打印ORC文件信息。

7. PostExecTezSummaryPrinter是一个post-execution hook,能够打印Tez计数器的摘要。

8. UpdateInputAccessTimeHook是一个pre-execution hook,雅思报名费可在运行查询以前更新全部输入表的访问时间。

 

640?wx_fmt=png栗子

下面写一个简单的?pre-execution hook,会在执行的时候输出Hello from the hook !!。

1. 建立一个工程。

 



? ?4.0.0

? ?hive-hook-example
? ?Hive-hook-example
? ?1.0

 

2. 添加hive-exec依赖。

hook的主要依赖就是hive-exec包。

 


? ? ? ?
? ? ? ? ? ?org.apache.hive
? ? ? ? ? ?hive-exec
? ? ? ? ? ?1.1.0
? ? ? ?
? ?

3.建立一个实现类。

该类要继承自

org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext

该接口只有一个方法。

 

;

咱们的实现仅仅是输出一个字符串。

 

System.out.();

完整的例子以下:

 

org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext;
org.apache.hadoop.hive.ql.hooks.HookContext;

{
? ?{
? ? ? ?System.out.println();
? ?}
}

 

4. 打包使用

?打包

 

mvn

使用

 

the Hive terminal issue the commands. Note that you have
jar target/Hive-hook-example.jar;
hive.exec.pre.hooks=HiveExampleHook;

 

更多hivehook例子,请参考hive源码,路径:

 

/

后面,浪尖给出hive的hook在安全控制和metastore监控的hook案例。

[完]

推荐阅读:

重要 | mr使用hcatalog读写hive表

必读|spark的重分区及排序

640?wx_fmt=jpeg


文章来源:http://www.javashuo.com/article/p-emgxhctt-er.html

相关文章
相关标签/搜索