如何进行Hive debug

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何进行Hive debug相关的知识,希望对你有一定的参考价值。

参考技术A 打开hive
debug日志
这个比较基本,也很容易操作。出问题时先打开,兴许有些有用的信息。另外我们自己的udf或serde里也可以输出些debug日志,方便定位问题:
hive
-hiveconf
hive.root.logger=debug,console
explain
即在hql前加上explain,比如
explain
select
*
from
...
不过这个在查错误的时候用处不大,我还没用它定位到什么bug。不过在查一些性能问题,或者查看下hive到mr任务的执行过程时会用得着
查看plan.xml
先得说下hive的执行过程。大体上是这样的:
hive
客户端(一般是hive
cli,入口类为clidriver)把hql翻译成mr执行计划(operator树)并序列化到
plan.xml
plan.xml
上传到hdfs上
hive
客户端新起一进程,提交mapreduce程序,其入口类为execdriver,execdriver的mapper会在setup阶段读取plan.xml,反序列化成operator树结构,然后执行。
所以plan.xml精确的描述了mr程序具体的执行过程,而且xml文件层次清楚,比explain输出更丰富的信息,也很易读。mr执行计划很少出问题,但我们可以借助plan.xml排除一些怀疑会出问题的点,比如确认是翻译阶段的问题,还是mr执行阶段的问题。
曾经有一次定位udf使用的bug,最开始怀疑是hive生成mr执行计划出错了,但通过查看plan.xml,我们确认翻译阶段没问题。进而开始使用终极手段来看问题:ide远程debug,单步跟踪,这个我们稍后说。
查看plan.xml的方法,有点trick。hive
cli在生成
plan.xml时,会打印日志:
generating
plan
file
/plan.xml
但hive
任务执行完毕时,会把它删掉。所以你得手快,或者想办法让hql跑的时间长点,比如sleep一下之类。如果有什么参数可以让hive不删plan文件,留言给我,
先行谢过。
参考技术B 打开hive
DEBUG日志
这个比较基本,也很容易操作。出问题时先打开,兴许有些有用的信息。另外我们自己的UDF或SerDe里也可以输出些DEBUG日志,方便定位问题:
hive
-hiveconf
hive.root.logger=DEBUG,console
explain
即在HQL前加上EXPLAIN,比如
EXPLAIN
SELECT
*
FROM
...
不过这个在查错误的时候用处不大,我还没用它定位到什么BUG。不过在查一些性能问题,或者查看下hive到MR任务的执行过程时会用得着

如何在 Hive 中使用字典进行映射?

【中文标题】如何在 Hive 中使用字典进行映射?【英文标题】:How would I use a dictionary for mapping in Hive? 【发布时间】:2021-11-03 13:47:34 【问题描述】:

假设我有一个表'my_table':

region_code | name
123         | 'test'
54          | 'test2'

还有一本字典:

dict = (123 -> "Moscow", 54 -> "Saint Petersburg")

我想做:

select dict[region_code] as region_code, name from my_table 获取:

region_code       | name
'Moscow'          | 'test'
'Saint Petersburg'| 'test2'

这在 hive 中可行吗?

【问题讨论】:

【参考方案1】:

Dict 是一个地图,您可以使用 map() 构造创建地图并在查询中使用。

演示:

with my_table as(--demo dataset, use real table instead
select 123 region_code, 'test' name union all
select 54,'test2'
)

select region_code,
       map(123, "Moscow", 54, "Saint Petersburg")[region_code] as region_name,
       name
  from my_table;

结果:

region_code region_name         name
123         Moscow              test
54          Saint Petersburg    test2

另外,如果你多次使用 dict,你可以使用变量:

--declare variable
set hiveconf:region_code_name_map=map(123, "Moscow", 54, "Saint Petersburg");

with my_table as(
select 123 region_code, 'test' name union all
select 54,'test2'
)

select region_code,
       --use variable substitution
       $hiveconf:region_code_name_map[region_code] as region_name,
       name
  from my_table;

或者使用宏+变量:

--declare variable
set hiveconf:region_code_name_map=map(123, "Moscow", 54, "Saint Petersburg");
--create a macro
create temporary macro code2name(code int) $hiveconf:region_code_name_map[code];

with my_table as(
select 123 region_code, 'test' name union all
select 54,'test2'
)

select region_code,
       --use macro
       code2name(region_code) as region_name,
       name
  from my_table

所有这些演示示例都产生相同的结果。也只能对地图内容进行参数化:123, "Moscow", 54, "Saint Petersburg",您可以将变量放入查询中的 map() 构造中。

【讨论】:

以上是关于如何进行Hive debug的主要内容,如果未能解决你的问题,请参考以下文章

Hive 源码解读 准备篇 Debug 讲解

hive日志配置

hive客户端远程debug

用java编写的hive udf、udaf、udtfs如何在eclipse之类的ide中调试?

如何在 hive 中进行字符串连接

如何在 Hive 中使用字典进行映射?