0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Hive如何提升查询效率

数据分析与开发 来源:数据社 作者:数据社 2021-11-18 15:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天分享一下Hive如何提升查询效率。Hive作为最常用的数仓计算引擎,是我们必备的技能,但是很多人只是会写Hql,并不会优化,也不知道如何提升查询效率,今天分享8条军规:

1、开启FetchTask

一个简单的查询语句,是指一个没有函数、排序等功能的语句,当开启一个Fetch Task功能,就执行一个简单的查询语句不会生成MapRreduce作业,而是直接使用FetchTask,从hdfs文件系统中进行查询输出数据,从而提高效率。

设置的方式:

Hive.fetch.task.conversion默认为minimal

修改配置文件hive-site.xml

hive.fetch.task.conversion
more

SomeselectqueriescanbeconvertedtosingleFETCHtask
minimizinglatency.Currentlythequeryshouldbesingle
sourcednothavinganysubqueryandshouldnothave
anyaggregationsordistincts(whichincurrsRS),
lateralviewsandjoins.
1.minimal:SELECTSTAR,FILTERonpartitioncolumns,LIMITonly
2.more:SELECT,FILTER,LIMITonly(+TABLESAMPLE,virtualcolumns)




或者当前session修改
hive>sethive.fetch.task.conversion=more;
执行SELECTid,moneyFROMmlimit10;不走mr

2、合并中间表

一个日志文件中,每一行记录,会有很多很多字段,四五十个字段很正常。实际分析中,常常使用少数几个字段将原始的表中数据,依据业务需求提取出要分析的字段,数据放入到对应的业务表(子表)中,实际的业务针对业务表进行分析。

在实际中,我们会发现,有些业务处理,会有共同数据集用户表、订单表、商品表,三个表需要进行join的操作,join 会产生一个结果集,会有很多的业务是针对此jion结果集进行分析。

优化:将众多的业务中相同的中间结果集,抽取到一个Hive中的表中去。

3、合理使用分区表

外部表、分区表,结合使用,采用多级分区。数据采用存储格式(textfile、orcfile、parquet)或者数据压缩(snappy)。

明细数据我们一般采用按天分区,对于特别大的表,可以采用子分区,每个分区其实对应到HDFS上就是一个目录。数据存储方式我们可以采用parquet列式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。在OLAP查询场景下,我们选择需要的列信息进行查询,而不是直接select * 查询所有字段。

4、jvm重用

JVM重用是hadoop调优参数的内容,对hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。hadoop默认配置是使用派生JVM来执行map和reduce任务的,这是jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。JVM重用可以使得JVM实例在同一个JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中进行设置

mapred.job.reuse.jvm.num.tasks 1

也可在hive的执行设置:

setmapred.job.reuse.jvm.num.tasks = 10;

JVM的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡“的job中有几个reduce task 执行的时间要比其他reduce task消耗的时间多得多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

5、speculative execution(推测执行)

所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,此时Job Tracker会启动一个新的任务(duplicate task),原有任务和新任务哪个先执行完就把另外一个kill掉。

推测执行需要设置Job的两个参数:

mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true

6、合理设置reduce个数

reduce个数

参数1:

hive.exec.reducers.bytes.per.reducer=256000000//每个reduce任务处理的数据量

参数2:

hive.exec.reducers.max=1009//每个任务最大的reduce数目

计算公式:reducer个数=min(参数2,总输入数据量/参数1)

set mapred.reduce.tasks =N:

每个任务默认的reduce数目。典型为0.99* reduce槽数,hive默认为-1,即自动确定reduce数目。

reduce个数并不是越多越好

同map一样,启动和初始化reduce也会消耗时间和资源;另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题。小文件过多会非常影响查询效率,文件越多造成的IO就越多,同时还会增加元数据(namenode)的压力。在生产环境中,一定要避免小文件问题,如果核查发现,及时合并文件!!

7、开启并行执行

并行执行,意思是同步执行hive的多个阶段,hive在执行过程,将一个查询转化成一个或者多个阶段。某个特定的job可能包含众多的阶段,而这些阶段可能并非完全相互依赖的,也就是说可以并行执行的,这样可能使得整个job的执行时间缩短

hive.exec.parallel.thread.number8//job并行执行的数目,一个SQL语句可能有很多mapreduce任务,限制
hive.exec.parallelfalse

hive执行开启:

sethive.exec.parallel=true

8、优化sql
  • where条件优化

优化前(关系数据库不用考虑会自动优化):

selectm.cid,u.idfromordermjoincustomeruon(m.cid=u.id)wherem.dt='20180808';

优化后(where条件在map端执行而不是在reduce端执行):

selectm.cid,u.idfrom(select*fromorderwheredt='20180818')mjoincustomeruon(m.cid=u.id);
  • union优化

尽量不要使用union (union 去掉重复的记录)而是使用 union all 然后在用group by 去重

  • count distinct优化

不要使用count (distinct cloumn) ,使用子查询。

selectcount(1)from(selectidfromtablenamegroupbyid)tmp;
  • 用in 来代替join

如果需要根据一个表的字段来约束另为一个表,尽量用in来代替join 。

selectid,namefromtb1ajointb2bon(a.id=b.id);

selectid,namefromtb1whereidin(selectidfromtb2);

in 要比join 快

  • 消灭子查询内的 group by 、 COUNT(DISTINCT),MAX,MIN。可以减少job的数量。

  • join 优化:

Common/shuffle/Reduce JOIN:连接发生的阶段,发生在reduce 阶段,适用于大表连接大表(默认的方式)

Map join :连接发生在map阶段,适用于小表连接大表大表的数据从文件中读取;小表的数据存放在内存中(hive中已经自动进行了优化,自动判断小表,然后进行缓存)。

sethive.auto.convert.join=true;

SMB join:Sort -Merge -Bucket Join 对大表连接大表的优化,用桶表的概念来进行优化。在一个桶内发送生笛卡尔积连接(需要是两个桶表进行join)

sethive.auto.convert.sortmerge.join=true;
sethive.optimize.bucketmapjoin=true;
sethive.optimize.bucketmapjoin.sortedmerge=true;
sethive.auto.convert.sortmerge.join.noconditionaltask=true;

责任编辑:haq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7349

    浏览量

    95046
  • hive
    +关注

    关注

    0

    文章

    12

    浏览量

    4150

原文标题:Hive 提高查询效率的八条军规

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MySQL慢查询调优指南

    MySQL慢查询是数据库性能问题的最常见原因。当一条SQL语句执行超过1秒时,就可能影响用户体验;超过10秒时,通常会收到用户投诉;而超过30秒的查询,往往意味着系统存在严重的性能问题。本文从实
    的头像 发表于 04-09 10:01 198次阅读

    京东订单API:批量订单处理,效率倍增!

    ,特别是其 批量处理能力 ,为我们提供了一种强大的解决方案,能够显著提升订单管理效率。 一、 单条处理 vs. 批量处理:效率差异显著 想象一下,你的系统需要查询1000个订单的状态
    的头像 发表于 01-26 14:14 415次阅读
    京东订单API:批量订单处理,<b class='flag-5'>效率</b>倍增!

    AGV机器人如何提升搬运效率

    AGV智能搬运车正颠覆传统物流模式,24小时精准作业、多车协同、自主避障,将搬运效率提升300%以上,成为智能制造的核心引擎。
    的头像 发表于 01-15 16:48 427次阅读
    AGV机器人如何<b class='flag-5'>提升</b>搬运<b class='flag-5'>效率</b>?

    公网访问开源 Stirling-PDF 工具,提升办公效率

    本文介绍了如何在Windows本地部署Stirling-PDF服务器,并通过内网穿透实现外网访问,提升PDF处理效率
    的头像 发表于 12-09 14:25 699次阅读
    公网访问开源 Stirling-PDF 工具,<b class='flag-5'>提升</b>办公<b class='flag-5'>效率</b>

    信维低损耗MLCC电容,提升电路效率优选

    信维低损耗MLCC电容在提升电路效率方面表现优异,其核心优势体现在 低损耗特性、高频响应能力、小型化设计、高可靠性 以及 广泛的应用适配性 ,具体分析如下: 一、低损耗特性直接提升电路效率
    的头像 发表于 11-24 16:30 1060次阅读

    AI技术赋能质检,提升效率和精准的双提升

    迅速成为推动产业质量升级的重要引擎。它不仅改变了企业“靠人眼识别缺陷”的传统模式,更推动了生产过程的数字化、标准化和智能化。  一、AI质检的核心优势  高效识别缺陷,提升检测效率  AI质检系统依托高精度摄像头、传感器
    的头像 发表于 11-12 15:49 755次阅读

    斑马技术助力PouchNATION提升大型活动管理效率

    斑马技术公司宣布 PouchNATION 通过采用斑马技术的高性能扫描解决方案,显著提升其大型活动的管理效率
    的头像 发表于 11-04 16:15 913次阅读

    汽车配件:使用VIN码查询API精准匹配车型配件,提升用户信任

    ​  引言 在汽车配件销售中,用户最担忧的问题是 配件不匹配 ——既浪费金钱又损害信任。传统依赖车型名称或年份的查询方式,错误率高达$15%-20%$。而VIN码(Vehicle
    的头像 发表于 09-28 15:18 882次阅读
    汽车配件:使用VIN码<b class='flag-5'>查询</b>API精准匹配车型配件,<b class='flag-5'>提升</b>用户信任

    淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量

    ,有效降低客服咨询量。 一、传统物流查询的痛点 信息不对称 买家需主动联系客服获取物流状态,造成时间延迟 客服资源浪费 简单查询占用专业客服,处理效率低于*$20%$* 体验断层 用户离开商品页就无法跟踪包裹,增加焦虑感 二、物
    的头像 发表于 09-22 14:34 668次阅读
    淘宝/天猫:使用物流<b class='flag-5'>查询</b>API实时显示包裹位置,减少客服咨询量

    常用PromQL查询案例总结

    在云原生时代,Prometheus已经成为监控领域的事实标准。作为一名资深运维工程师,我见过太多团队在PromQL查询上踩坑,也见过太多因为监控不到位导致的生产事故。今天分享10个实战中最常用的PromQL查询案例,每一个都是血泪经验的总结。
    的头像 发表于 09-18 14:54 879次阅读

    三坐标如何实现测量效率提升

    精密制造的产线节奏日益加快,传统三坐标测量机面临着“要么放慢速度保精度,要么牺牲精度换速度”的困境制约着生产效率提升。MizarGold三坐标测量机通过材料创新与传动优化,实现了测量速度快的同时不
    的头像 发表于 09-11 16:47 1639次阅读
    三坐标如何实现测量<b class='flag-5'>效率</b>的<b class='flag-5'>提升</b>?

    如何评估通信协议优化对数据传输效率提升效果?

    评估通信协议优化对数据传输效率提升效果,核心逻辑是 “控制变量 + 多维度量化对比”—— 即通过定义明确的评估目标、构建一致的测试环境、选取关键效率指标,对比优化前后的协议表现,最终验证优化是否达到预期(如降低延迟、
    的头像 发表于 08-29 17:52 1466次阅读

    电驱动系统EMC测试整改:AI仿真技术如何提升效率

    深圳南柯电子|电驱动系统EMC测试整改:AI仿真技术如何提升效率
    的头像 发表于 08-25 11:01 1004次阅读

    同步整流MOSFET的设计要点与效率提升技巧

    。其核心器件——MOSFET,在设计中扮演着至关重要的角色。本文将深入探讨同步整流MOSFET的选型要点和提升效率的设计技巧。一、同步整流的基本原理传统整流使用二极
    的头像 发表于 07-03 09:42 1305次阅读
    同步整流MOSFET的设计要点与<b class='flag-5'>效率</b><b class='flag-5'>提升</b>技巧

    全球各大品牌利用NVIDIA AI技术提升运营效率

    欧莱雅、LVMH 集团和雀巢利用 NVIDIA 加速的智能体 AI 和物理 AI,大幅提升产品设计、营销及物流等方面的运营效率
    的头像 发表于 06-19 14:36 1369次阅读