hiveexplain的简单介绍

本篇文章给大家谈谈hiveexplain,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何进行Hive debug

打开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文件,留言给我,

先行谢过。

[img]

Hive SQL语句执行顺序

Hive 中 sql 语句的执行顺序如下:

from .. where .. join .. on .. select .. group by .. select .. having .. distinct .. order by .. limit .. union/union all

下面我们通过一个 sql 语句分析下:

上面这条 sql 语句是可以成功孙睁执行的,我们看下它在 MR 中的执行顺序:

Map 阶段 :

Reduce 阶段 :

上面这个执行顺序到底对基乱不对呢,我们可以通过 explain 执行计划来看下,内容过多,我们分阶段来看。

我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。

图中标 ① 处是表扫描操作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤操作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤操作,这样可以减少关联的数据量。

先扫描 a 表(图中标 ① 处);接下来进行过滤操作 idno '112233'(图中标 ② 处);然后进行 left join,关联的 key 是 idno(图搏凯档中标 ③ 处);执行完关联操作之后会进行输出操作,输出的是三个字段,包括 select 的两个字段加 group by 的一个字段(图中标 ④ 处);然后进行 group by 操作,分组方式是 hash(图中标 ⑤ 处);然后进行排序操作,按照 idno 进行正向排序(图中标 ⑥ 处)。

首先进行 group by 操作,注意此时的分组方式是 mergepartial 合并分组(图中标 ① 处);然后进行 select 操作,此时输出的字段只有两个了,输出的行数是 30304 行(图中标 ② 处);接下来执行 having 的过滤操作,过滤出 count_user1 的字段,输出的行数是 10101 行(图中标 ③ 处);然后进行 limit 限制输出的行数(图中标 ④ 处);图中标 ⑤ 处表示是否对文件压缩,false 不压缩。

限制最终输出的行数为 10 行。

通过上面对 SQL 执行计划的分析,总结以下几点:

hive基础调优方法(一)

1.查看执行计划:Explain

查看执行计划:explain select kind, count(*) from table_name group by kind

常见名词示意:

STAGE DEPENDENCIES:阶段的依赖关系

FETCH Operator :抓取操作

limit: -1 未对数据做限制

TableScan:扫描的表

alias:查询的表名

Select Operator:查询操作

expressions:查询的列名

outputColumnNames:输出的别名

详改雹细执行计划:explain extended select kind, count(*) from table_name group by kind

2.分区表:分区对应不同文件夹。

查询时用where语句可以指定分区目录蔽配dt='20211112'。

建表时用partitioned by(dt string)。

加载时需要指定分区信息 into table partition_table partition(dt='20211112')。

增加分区alter partition_table add partition(dt='20211122')。

删除分区alter partition_table drop partition(dt='20211122')。

可同时增加或删除多个,增加只需空格,删除中间需要逗号隔开。

查看分区 show partitions partition_table;

分区字段可以指定多个。

3.动态分区:

动态分区:set hive.exec.dynamic.partition=true;

非严格状态:set hive.exec.dynamic.partition.mode=nonstrict;

最大可创建动态分区:set hive.exec.max.dynamic.partitions=1000;

单个MR最大可创建动态分区:set hive.exec.max.dynamic.partitions.pernode=100

MR Job 中,最大可以创建多少个 HDFS 文件:set hive.exec.max.created.files=100000

空分区时否需要核并帆抛出异常:set hive.error.on.empty.partition=false

4.分桶表:将数据放到不同的文件

创建表clustered by(id)

用于抽样tablesample(bucket 1 out of 4 on id);

5.文件存储和压缩格式

行存储TEXTFILE、SEQUENCEFILE

列存储ORC、PARQUET

LZO和SNAPPY有优秀的压缩比和压缩速度

6.裁剪

列裁剪,只读取需要的列

分区裁剪,只读取需要的分区

7.group by数据倾斜

Map端进行聚合:set hive.map.aggr = true;

Map端进行聚合操作的条目数目 set hive.groupby.mapaggr.checkinterval = 100000;

有数据倾斜的时候进行负载均衡:set hive.groupby.skewindata = true;

8.矢量计算,可以在似scan, filter, aggregation进行批量处理

set hive.vectorized.execution.enabled = true;

set hive.vectorized.execution.reduce.enabled = true;

9.left semi join用来替代exist/in

10.CBO优化

成本优化器

set hive.cbo.enable=true;

set hive.compute.query.using.stats=true;

set hive.stats.fetch.column.stats=true;

set hive.stats.fetch.partition.stats=true;

11.谓词下推

set hive.optimize.ppd = true;

12.mapjoin:大表left join小表

set hive.auto.convert.join=true;

set hive.mapjoin.smalltable.filesize=25000000;

13.大表和大表join(极少用到)

Sort Merge Bucket Join

建表时

clustered by(id)

sorted by(id)

into 3 buckets

开启桶join

set hive.optimize.bucketmapjoin = true;

set hive.optimize.bucketmapjoin.sortedmerge = true;

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

14.笛卡尔积

hive.mapred.mode=strict;开启后不会出现笛卡尔积

关于hiveexplain和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表