最近在做关于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文件实现!
在项目进行的过程中,我们尝试了很多方式!在尝试的过程中虽然也有很多失败,但对于理解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文件实现!