0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Hive如何提升查詢效率

數(shù)據(jù)分析與開發(fā) ? 來(lái)源:數(shù)據(jù)社 ? 作者:數(shù)據(jù)社 ? 2021-11-18 15:53 ? 次閱讀
今天分享一下Hive如何提升查詢效率。Hive作為最常用的數(shù)倉(cāng)計(jì)算引擎,是我們必備的技能,但是很多人只是會(huì)寫Hql,并不會(huì)優(yōu)化,也不知道如何提升查詢效率,今天分享8條軍規(guī):

1、開啟FetchTask

一個(gè)簡(jiǎn)單的查詢語(yǔ)句,是指一個(gè)沒有函數(shù)、排序等功能的語(yǔ)句,當(dāng)開啟一個(gè)Fetch Task功能,就執(zhí)行一個(gè)簡(jiǎn)單的查詢語(yǔ)句不會(huì)生成MapRreduce作業(yè),而是直接使用FetchTask,從hdfs文件系統(tǒng)中進(jìn)行查詢輸出數(shù)據(jù),從而提高效率。

設(shè)置的方式:

Hive.fetch.task.conversion默認(rèn)為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)




或者當(dāng)前session修改
hive>sethive.fetch.task.conversion=more;
執(zhí)行SELECTid,moneyFROMmlimit10;不走mr

2、合并中間表

一個(gè)日志文件中,每一行記錄,會(huì)有很多很多字段,四五十個(gè)字段很正常。實(shí)際分析中,常常使用少數(shù)幾個(gè)字段將原始的表中數(shù)據(jù),依據(jù)業(yè)務(wù)需求提取出要分析的字段,數(shù)據(jù)放入到對(duì)應(yīng)的業(yè)務(wù)表(子表)中,實(shí)際的業(yè)務(wù)針對(duì)業(yè)務(wù)表進(jìn)行分析。

在實(shí)際中,我們會(huì)發(fā)現(xiàn),有些業(yè)務(wù)處理,會(huì)有共同數(shù)據(jù)集用戶表、訂單表、商品表,三個(gè)表需要進(jìn)行join的操作,join 會(huì)產(chǎn)生一個(gè)結(jié)果集,會(huì)有很多的業(yè)務(wù)是針對(duì)此jion結(jié)果集進(jìn)行分析。

優(yōu)化:將眾多的業(yè)務(wù)中相同的中間結(jié)果集,抽取到一個(gè)Hive中的表中去。

3、合理使用分區(qū)表

外部表、分區(qū)表,結(jié)合使用,采用多級(jí)分區(qū)。數(shù)據(jù)采用存儲(chǔ)格式(textfile、orcfile、parquet)或者數(shù)據(jù)壓縮(snappy)。

明細(xì)數(shù)據(jù)我們一般采用按天分區(qū),對(duì)于特別大的表,可以采用子分區(qū),每個(gè)分區(qū)其實(shí)對(duì)應(yīng)到HDFS上就是一個(gè)目錄。數(shù)據(jù)存儲(chǔ)方式我們可以采用parquet列式存儲(chǔ),同時(shí)具有很好的壓縮性能;同時(shí)可以減少大量的表掃描和反序列化的時(shí)間。在OLAP查詢場(chǎng)景下,我們選擇需要的列信息進(jìn)行查詢,而不是直接select * 查詢所有字段。

4、jvm重用

JVM重用是hadoop調(diào)優(yōu)參數(shù)的內(nèi)容,對(duì)hive的性能具有非常大的影響,特別是對(duì)于很難避免小文件的場(chǎng)景或者task特別多的場(chǎng)景,這類場(chǎng)景大多數(shù)執(zhí)行時(shí)間都很短。hadoop默認(rèn)配置是使用派生JVM來(lái)執(zhí)行map和reduce任務(wù)的,這是jvm的啟動(dòng)過程可能會(huì)造成相當(dāng)大的開銷,尤其是執(zhí)行的job包含有成千上萬(wàn)個(gè)task任務(wù)的情況。JVM重用可以使得JVM實(shí)例在同一個(gè)JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中進(jìn)行設(shè)置

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

也可在hive的執(zhí)行設(shè)置:

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

JVM的一個(gè)缺點(diǎn)是,開啟JVM重用將會(huì)一直占用使用到的task插槽,以便進(jìn)行重用,直到任務(wù)完成后才能釋放。如果某個(gè)“不平衡“的job中有幾個(gè)reduce task 執(zhí)行的時(shí)間要比其他reduce task消耗的時(shí)間多得多的話,那么保留的插槽就會(huì)一直空閑著卻無(wú)法被其他的job使用,直到所有的task都結(jié)束了才會(huì)釋放。

5、speculative execution(推測(cè)執(zhí)行)

所謂的推測(cè)執(zhí)行,就是當(dāng)所有task都開始運(yùn)行之后,Job Tracker會(huì)統(tǒng)計(jì)所有任務(wù)的平均進(jìn)度,如果某個(gè)task所在的task node機(jī)器配置比較低或者CPU load很高(原因很多),導(dǎo)致任務(wù)執(zhí)行比總體任務(wù)的平均執(zhí)行要慢,此時(shí)Job Tracker會(huì)啟動(dòng)一個(gè)新的任務(wù)(duplicate task),原有任務(wù)和新任務(wù)哪個(gè)先執(zhí)行完就把另外一個(gè)kill掉。

推測(cè)執(zhí)行需要設(shè)置Job的兩個(gè)參數(shù):

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

6、合理設(shè)置reduce個(gè)數(shù)

reduce個(gè)數(shù)

參數(shù)1:

hive.exec.reducers.bytes.per.reducer=256000000//每個(gè)reduce任務(wù)處理的數(shù)據(jù)量

參數(shù)2:

hive.exec.reducers.max=1009//每個(gè)任務(wù)最大的reduce數(shù)目

計(jì)算公式:reducer個(gè)數(shù)=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)

set mapred.reduce.tasks =N:

每個(gè)任務(wù)默認(rèn)的reduce數(shù)目。典型為0.99* reduce槽數(shù),hive默認(rèn)為-1,即自動(dòng)確定reduce數(shù)目。

reduce個(gè)數(shù)并不是越多越好

同map一樣,啟動(dòng)和初始化reduce也會(huì)消耗時(shí)間和資源;另外,有多少個(gè)reduce,就會(huì)有多少個(gè)輸出文件,如果生成了很多個(gè)小文件,那么如果這些小文件作為下一個(gè)任務(wù)的輸入,則也會(huì)出現(xiàn)小文件過多的問題。小文件過多會(huì)非常影響查詢效率,文件越多造成的IO就越多,同時(shí)還會(huì)增加元數(shù)據(jù)(namenode)的壓力。在生產(chǎn)環(huán)境中,一定要避免小文件問題,如果核查發(fā)現(xiàn),及時(shí)合并文件?。?/span>

7、開啟并行執(zhí)行

并行執(zhí)行,意思是同步執(zhí)行hive的多個(gè)階段,hive在執(zhí)行過程,將一個(gè)查詢轉(zhuǎn)化成一個(gè)或者多個(gè)階段。某個(gè)特定的job可能包含眾多的階段,而這些階段可能并非完全相互依賴的,也就是說(shuō)可以并行執(zhí)行的,這樣可能使得整個(gè)job的執(zhí)行時(shí)間縮短

hive.exec.parallel.thread.number8//job并行執(zhí)行的數(shù)目,一個(gè)SQL語(yǔ)句可能有很多mapreduce任務(wù),限制
hive.exec.parallelfalse

hive執(zhí)行開啟:

sethive.exec.parallel=true

8、優(yōu)化sql
  • where條件優(yōu)化

優(yōu)化前(關(guān)系數(shù)據(jù)庫(kù)不用考慮會(huì)自動(dòng)優(yōu)化):

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

優(yōu)化后(where條件在map端執(zhí)行而不是在reduce端執(zhí)行):

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

盡量不要使用union (union 去掉重復(fù)的記錄)而是使用 union all 然后在用group by 去重

  • count distinct優(yōu)化

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

selectcount(1)from(selectidfromtablenamegroupbyid)tmp;
  • 用in 來(lái)代替join

如果需要根據(jù)一個(gè)表的字段來(lái)約束另為一個(gè)表,盡量用in來(lái)代替join 。

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

selectid,namefromtb1whereidin(selectidfromtb2);

in 要比join 快

  • 消滅子查詢內(nèi)的 group by 、 COUNT(DISTINCT),MAX,MIN??梢詼p少job的數(shù)量。

  • join 優(yōu)化:

Common/shuffle/Reduce JOIN:連接發(fā)生的階段,發(fā)生在reduce 階段,適用于大表連接大表(默認(rèn)的方式)

Map join :連接發(fā)生在map階段,適用于小表連接大表大表的數(shù)據(jù)從文件中讀??;小表的數(shù)據(jù)存放在內(nèi)存中(hive中已經(jīng)自動(dòng)進(jìn)行了優(yōu)化,自動(dòng)判斷小表,然后進(jìn)行緩存)。

sethive.auto.convert.join=true;

SMB join:Sort -Merge -Bucket Join 對(duì)大表連接大表的優(yōu)化,用桶表的概念來(lái)進(jìn)行優(yōu)化。在一個(gè)桶內(nèi)發(fā)送生笛卡爾積連接(需要是兩個(gè)桶表進(jìn)行join)

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

責(zé)任編輯:haq


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88308
  • hive
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    3820

原文標(biāo)題:Hive 提高查詢效率的八條軍規(guī)

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    抗金屬RFID標(biāo)簽如何提升資產(chǎn)管理效率

    抗金屬RFID標(biāo)簽解決金屬環(huán)境下RFID信號(hào)干擾問題,提升資產(chǎn)管理效率,實(shí)現(xiàn)快速盤點(diǎn)和位置跟蹤,耐用性強(qiáng),適合惡劣環(huán)境,助力企業(yè)數(shù)字化轉(zhuǎn)型,實(shí)現(xiàn)資產(chǎn)全生命周期管理。
    的頭像 發(fā)表于 09-14 16:32 ?111次閱讀

    ClickHouse內(nèi)幕(3)基于索引的查詢優(yōu)化

    ClickHouse索引采用唯一聚簇索引的方式,即Part內(nèi)數(shù)據(jù)按照order by keys有序,在整個(gè)查詢計(jì)劃中,如果算子能夠有效利用輸入數(shù)據(jù)的有序性,對(duì)算子的執(zhí)行性能將有巨大的提升。本文討論
    的頭像 發(fā)表于 06-11 10:46 ?724次閱讀
    ClickHouse內(nèi)幕(3)基于索引的<b class='flag-5'>查詢</b>優(yōu)化

    “Spark+Hive”在DPU環(huán)境下的性能測(cè)評(píng) | OLAP數(shù)據(jù)庫(kù)引擎選型白皮書(24版)DPU部分節(jié)選

    在奇點(diǎn)云2024年版《OLAP數(shù)據(jù)庫(kù)引擎選型白皮書》中,中科馭數(shù)聯(lián)合奇點(diǎn)云針對(duì)Spark+Hive這類大數(shù)據(jù)計(jì)算場(chǎng)景下的主力引擎,測(cè)評(píng)DPU環(huán)境下對(duì)比CPU環(huán)境下的性能提升效果。特此節(jié)選該章節(jié)內(nèi)容,與大家共享。
    的頭像 發(fā)表于 05-30 16:09 ?318次閱讀
    “Spark+<b class='flag-5'>Hive</b>”在DPU環(huán)境下的性能測(cè)評(píng) | OLAP數(shù)據(jù)庫(kù)引擎選型白皮書(24版)DPU部分節(jié)選

    如何提升代碼質(zhì)量與效率的秘訣

    提高編程能力其實(shí)沒有捷徑,最佳方式就是多寫代碼。 不過,除了寫大量代碼,提升編程能力還需要大量閱讀別人寫的代碼。
    的頭像 發(fā)表于 04-28 14:53 ?288次閱讀
    如何<b class='flag-5'>提升</b>代碼質(zhì)量與<b class='flag-5'>效率</b>的秘訣

    光伏并網(wǎng)逆變器如何提升轉(zhuǎn)換效率?

    提升光伏并網(wǎng)逆變器的轉(zhuǎn)換效率是光伏系統(tǒng)優(yōu)化和提高經(jīng)濟(jì)效益的重要途徑。
    的頭像 發(fā)表于 04-18 16:39 ?682次閱讀

    AGV小車 | 提升倉(cāng)儲(chǔ)物流運(yùn)營(yíng)效率的好幫手

    近幾年,由于人力成本的提高,各行各業(yè)加速采用智能化的物流設(shè)備替代人工,達(dá)到降低成本、提升效率的目的,而AGV自動(dòng)導(dǎo)引車就是其中頗具代表性的設(shè)備,AGV因其作業(yè)的高效性在制造企業(yè)內(nèi)得到了大量
    的頭像 發(fā)表于 04-16 18:30 ?824次閱讀
    AGV小車 | <b class='flag-5'>提升</b>倉(cāng)儲(chǔ)物流運(yùn)營(yíng)<b class='flag-5'>效率</b>的好幫手

    SiC器件如何提升電動(dòng)汽車的系統(tǒng)效率

    SiC器件可以提高電動(dòng)汽車的充電模塊性能,包括提高頻率、降低損耗、縮小體積以及提升效率等。這有助于提升電動(dòng)汽車的整體性能表現(xiàn)。
    的頭像 發(fā)表于 03-18 18:12 ?1440次閱讀
    SiC器件如何<b class='flag-5'>提升</b>電動(dòng)汽車的系統(tǒng)<b class='flag-5'>效率</b>

    潞晨科技Colossal-AI + 浪潮信息AIStation,大模型開發(fā)效率提升10倍

    的潞晨科技Colossal-AI系統(tǒng),用戶可實(shí)現(xiàn)在本地算力平臺(tái)一鍵訓(xùn)練、微調(diào)、推理、部署大模型,將大模型開發(fā)效率提升10倍以上,并將算力效率提升2-3倍,在最大化
    的頭像 發(fā)表于 03-01 09:43 ?379次閱讀
    潞晨科技Colossal-AI + 浪潮信息AIStation,大模型開發(fā)<b class='flag-5'>效率</b><b class='flag-5'>提升</b>10倍

    DC電源模塊:提升效率,降低能耗的利器

    BOSHIDA ?DC電源模塊:提升效率,降低能耗的利器 DC電源模塊是一種將交流電轉(zhuǎn)換為直流電的設(shè)備,廣泛應(yīng)用于各種電子設(shè)備中。它的主要作用是提供穩(wěn)定的直流電源,以供電子設(shè)備正常運(yùn)行。 DC
    的頭像 發(fā)表于 01-23 14:13 ?295次閱讀
    DC電源模塊:<b class='flag-5'>提升</b><b class='flag-5'>效率</b>,降低能耗的利器

    如何提升單片機(jī)開發(fā)技術(shù)?

    單片機(jī)開發(fā)是現(xiàn)代電子技術(shù)中的重要分支,其在各個(gè)領(lǐng)域都有著廣泛的應(yīng)用。單片機(jī)開發(fā)技術(shù)的提升不僅可以提高工作效率,還可以提高工作質(zhì)量和創(chuàng)新能力。那么,如何提升單片機(jī)開發(fā)技術(shù)呢? 一、加強(qiáng)基礎(chǔ)知識(shí)
    發(fā)表于 01-05 10:14

    SQL改寫消除相關(guān)子查詢實(shí)踐

    GaussDB (DWS) 根據(jù)子查詢在 SQL 語(yǔ)句中的位置把子查詢分成了子查詢、子鏈接兩種形式。
    的頭像 發(fā)表于 12-27 09:51 ?351次閱讀

    新半導(dǎo)體技術(shù)將提升功率轉(zhuǎn)換效率

    新半導(dǎo)體技術(shù)將提升功率轉(zhuǎn)換效率
    的頭像 發(fā)表于 12-15 09:18 ?339次閱讀
    新半導(dǎo)體技術(shù)將<b class='flag-5'>提升</b>功率轉(zhuǎn)換<b class='flag-5'>效率</b>

    物聯(lián)網(wǎng)監(jiān)控運(yùn)維系統(tǒng)助力膜切行業(yè)協(xié)同效率提升

    物聯(lián)網(wǎng)監(jiān)控運(yùn)維系統(tǒng)助力膜切行業(yè)協(xié)同效率提升
    的頭像 發(fā)表于 12-04 13:42 ?307次閱讀

    分布式數(shù)據(jù)恢復(fù)-hbase+hive分布式存儲(chǔ)誤刪除文件的數(shù)據(jù)恢復(fù)方案

    hbase+hive分布式存儲(chǔ)數(shù)據(jù)恢復(fù)環(huán)境: 16臺(tái)某品牌R730XD服務(wù)器節(jié)點(diǎn),每臺(tái)物理服務(wù)器節(jié)點(diǎn)上有數(shù)臺(tái)虛擬機(jī),虛擬機(jī)上配置的分布式,上層部署hbase數(shù)據(jù)庫(kù)+hive數(shù)據(jù)倉(cāng)庫(kù)
    的頭像 發(fā)表于 11-24 15:55 ?331次閱讀

    多線程并發(fā)查詢oracle數(shù)據(jù)庫(kù)

    多線程并發(fā)查詢Oracle數(shù)據(jù)庫(kù)是指在同一時(shí)間內(nèi)有多個(gè)線程同時(shí)執(zhí)行數(shù)據(jù)庫(kù)查詢操作。這種并發(fā)查詢的方式可以提高系統(tǒng)的吞吐量和響應(yīng)速度,提高數(shù)據(jù)庫(kù)的效率和性能。本文將詳細(xì)介紹多線程并發(fā)
    的頭像 發(fā)表于 11-17 14:22 ?3097次閱讀