hive 查看历史job的执行sql

本文针对线上Hive SQL执行耗时较长的问题进行定位与优化,通过调整job配置,将全量查询改为增量,并限制mapperreduce数量,显著提升查询速度。

 

问题

线上hadoop有个hive sql执行较耗时,1hour 8min;收到运维预警

 

定位

查找job history 页面

http://node:8088/cluster/app/application_xxxx_xx

http://node:8088/proxy/application_xxxx_xx

http://node:19888/jobhistory/job/job_xxxx_xx

 

选取Local logs

 

hadoop-cmf-yarn-JOBHISTORY-node.log.out

 

从日志中查找到 job的conf.xml文件路径

hdfs://nameservice:8020/user/history/done/2020/02/01/001182/job_xxxx_xx_conf.xml

 

conf.xml中查找 hive.query.string

<name>hive.query.string</name>

<value> sql </value>

 

hadoop fs -text /user/history/done/2018/06/27/000008/job_1526892856952_8007_conf.xml

 

解决

  • 全量修改为增量
  • set 参数限制mapper reduce 数量

 

set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000;

set mapred.reduce.tasks=10;

 

参考

http://blog.sina.com.cn/s/blog_6dd718930102xrhl.html

Hive SQL执行过程可以分为多个阶段,其中最关键的是如何将SQL语句拆分为多个Job和Task,以便在分布式计算框架(如MapReduce或Tez)上执行。整个过程主要包括以下几个步骤: 1. **SQL解析与抽象语法树(AST)生成** Hive首先通过HiveQL解析器将SQL语句转换为抽象语法树(AST),这一过程基于ANTLR定义的语法文件(如`HiveParser.g`)进行[^4]。该AST结构表示了SQL语句的逻辑结构,便于后续的语义分析。 2. **语义分析与逻辑计划生成** 在语义分析阶段,Hive会检查表和列的元信息、权限等,并将AST转换为一个逻辑执行计划(Logical Plan)。此阶段还会确定SQL操作符(Operator Tree),包括Map阶段和Reduce阶段的算子[^1]。 3. **逻辑计划优化** Hive对逻辑计划进行优化,包括谓词下推(Predicate Pushdown)、列裁剪(Column Pruning)、Join优化等。这些优化措施有助于减少数据传输量并提高执行效率。 4. **物理计划生成与Job划分** 在生成物理执行计划时,Hive会根据算子类型(如ReduceSink)来划分Job。具体来说,当遇到ReduceSink操作符时,Hive会将其划分为一个新的Stage,类似于Spark中通过Shuffle划分Stage的机制。每个Stage最终会被转换为一个MapReduce Job或Tez DAG任务[^1]。 5. **Task生成与执行调度** 每个Job内部会被进一步拆分为多个Task,包括Map Task和Reduce Task。Hive根据输入数据的分片情况生成相应的Map Task,并根据ReduceSink的分区策略生成Reduce Task。这些Task会被提交到YARN等资源调度系统上并发执行。 6. **并行执行优化** Hive支持通过设置参数来提升作业的并行度。例如,启用并行执行模式后,多个Job可以在没有依赖关系的情况下并发执行: ```sql set hive.exec.parallel=true; set hive.exec.parallel.thread.number=8; ``` 这样可以显著缩短整体执行时间,特别是在处理多个独立子任务时[^2]。 ### 示例:Hive SQL执行流程中的Job划分 假设执行以下Hive SQL: ```sql SELECT a.id, b.name FROM table_a a JOIN table_b b ON a.id = b.id WHERE a.status = 'active'; ``` 执行流程如下: - **Stage 1(MapReduce Job 1)**: - Map Task:读取`table_a`和`table_b`的数据,执行过滤条件`a.status = 'active'`,并为Join操作准备数据。 - Reduce Task:根据`id`进行Shuffle和Sort,执行Join操作,输出结果。 - **Stage 2(可选,如果后续有聚合操作)**: - 如果SQL中包含`GROUP BY`或`ORDER BY`等操作,可能生成新的Stage,对应新的MapReduce Job
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FireCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值