如何进行Hive debug
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何进行Hive debug相关的知识,希望对你有一定的参考价值。
参考技术A 打开hivedebug日志
这个比较基本,也很容易操作。出问题时先打开,兴许有些有用的信息。另外我们自己的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的主要内容,如果未能解决你的问题,请参考以下文章