CouderaHadoop中hive的Hook扩展

最近在做关于CDH4.3.0的hive封装,其中遇到了很多问题!其中最困难的是如何在不更改源代码的情况下动态获取jobId!

在项目进行的过程中,我们尝试了很多方式!在尝试的过程中虽然也有很多失败,但对于理解hive的内部机制也更一步的认识,我这里想说的是自定义扩展hook!

在CDH版本的hive中提供了很多hook,俗称钩子函数!这样我们可以通过自定义hook,来对hive进行扩展!这里我就不对hive的执行原理进行赘述了,网上的资料一堆一堆的!中间过程也相当复杂!

这里我大致描述下hive中的一种hook扩展(org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext),其他的扩展方式基本上都大同小异!

在此之前我们要先大致清除下hive的执行流程,其中的核心类org.apache.hadoop.ql.Driver类是实际执行hive语句的类,其中核心方法之一有run(cmd),这里的cmd实际就是我们要执行的sql语句了!我们根据ExecuteWithHookContext扩展的hook也是在此方法的前后进行执行!这里我介绍的是如何扩展前置钩,也就是在run(cmd)方法执行之前(hive语句会经过编译优化等步骤生成MapReduce任务,这里还未提交MapReduce任务)

下面说说该如何进行扩展(这里用的maven构建工具):

1:自定义一个类实现ExecuteWithHookContext接口

Hclass MyPreHook implements ExecuteHookContext{

public void run(HookContext hookContext) throws Exception{

//这里我们可以做自己想做的事情,比如拿到SessionState、QueryPlan等,获取各种信息

}

}

2:将上面的自定义hook打成jar包,放置到hive的lib目录下

3:关键的一步,修改hive-site.xml文件,增加如下配置

<property>

<name>hive.exec.pre.hooks</name>

<value>自定义hook完整类名</value>

</property>

4:重启hive(各种方式有所不同,我都是采用hiveserver进行操作,所以我是先kill掉hiveserver服务再启动)

5:然后再执行hive语句,我们自定义的hook就能自动执行了!

注:常见问题

(1):hive启动过程中,出现无法找到自定义的hook!这里可以尝试将扩展jar包添加到Hive的classpath下,可以通过修改hive-env.sh文件实现!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值