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)過(guò)程可能會(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)小文件過(guò)多的問題。小文件過(guò)多會(huì)非常影響查詢效率,文件越多造成的IO就越多,同時(shí)還會(huì)增加元數(shù)據(jù)(namenode)的壓力。在生產(chǎn)環(huán)境中,一定要避免小文件問題,如果核查發(fā)現(xiàn),及時(shí)合并文件??!

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

并行執(zhí)行,意思是同步執(zhí)行hive的多個(gè)階段,hive在執(zhí)行過(guò)程,將一個(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

    文章

    7048

    瀏覽量

    89078
  • hive
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    3850

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Triton編譯器如何提升編程效率

    在現(xiàn)代軟件開發(fā)中,編譯器扮演著至關(guān)重要的角色。它們不僅將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的代碼,還通過(guò)各種優(yōu)化技術(shù)提升程序的性能。Triton 編譯器作為一種先進(jìn)的編譯器,通過(guò)多種方式提升編程效率,使得
    的頭像 發(fā)表于 12-25 09:12 ?216次閱讀

    如何使SOLIDWORKS參數(shù)化設(shè)計(jì)軟件提升效率

    SOLIDWORKS參數(shù)化設(shè)計(jì)軟件-SolidKits.AutoWorks可實(shí)現(xiàn)智能選型、自動(dòng)化修改產(chǎn)品屬性、產(chǎn)品參數(shù)、產(chǎn)品狀態(tài)、圖紙更新、重命名、并自動(dòng)打包生成交付物,實(shí)現(xiàn)產(chǎn)品自動(dòng)設(shè)計(jì)。大幅提升設(shè)計(jì)效率,減少錯(cuò)誤、降低對(duì)人工經(jīng)驗(yàn)的要求和用人成本。
    的頭像 發(fā)表于 12-19 15:53 ?238次閱讀

    永磁同步電機(jī)效率提升方法

    提升永磁同步電機(jī)效率的方法可以從多個(gè)方面進(jìn)行,以下是一些有效的方法: 優(yōu)化電機(jī)設(shè)計(jì) : 增加磁場(chǎng)的強(qiáng)度:通過(guò)增加永磁體的磁通密度和提高永磁體及鐵心的磁導(dǎo)率,可以有效提升電機(jī)的磁場(chǎng)強(qiáng)度,從而提高
    的頭像 發(fā)表于 11-22 10:13 ?355次閱讀

    高效生產(chǎn)秘訣:掌握提升SMT貼片效率的拼板設(shè)計(jì)技巧

    一站式PCBA智造廠家今天為大家講講PCBA拼板設(shè)計(jì)的主要目的有哪些?提升SMT貼片效率的拼板設(shè)計(jì)方法。PCBA拼板設(shè)計(jì)是將多個(gè)小PCBA單元通過(guò)各種連接方式組合在一起,以提高生產(chǎn)效率和降低成本
    的頭像 發(fā)表于 11-21 09:34 ?190次閱讀

    如何提升EDA設(shè)計(jì)效率

    EDA(Electronic Design Automation,電子設(shè)計(jì)自動(dòng)化)設(shè)計(jì)技術(shù)是現(xiàn)代電子工程領(lǐng)域的關(guān)鍵技術(shù)之一,提升EDA設(shè)計(jì)效率對(duì)于電子工程師和整個(gè)電子行業(yè)都至關(guān)重要。以下是一些提升
    的頭像 發(fā)表于 11-08 14:23 ?460次閱讀

    提升效率:RTC時(shí)鐘實(shí)用設(shè)置

    今天來(lái)給大家講解的是RTC時(shí)鐘實(shí)用性,提升絕對(duì)的效率。
    的頭像 發(fā)表于 11-04 16:35 ?804次閱讀
    <b class='flag-5'>提升</b><b class='flag-5'>效率</b>:RTC時(shí)鐘實(shí)用設(shè)置

    如何提升RFID手持終端的讀寫效率

    RFID(射頻識(shí)別)手持終端是一種便攜式設(shè)備,用于讀取和寫入RFID標(biāo)簽。提升RFID手持終端的讀寫效率對(duì)于提高物流、庫(kù)存管理、零售等行業(yè)的工作效率至關(guān)重要。以下是一些提升RFID手持
    的頭像 發(fā)表于 10-29 09:41 ?249次閱讀

    住宅動(dòng)態(tài)IP:提升網(wǎng)絡(luò)安全與效率

    住宅動(dòng)態(tài)IP是指住宅用戶所使用的IP地址不是固定的,而是會(huì)定期自動(dòng)更換。這種配置方式在提升網(wǎng)絡(luò)安全與效率方面發(fā)揮著重要作用。
    的頭像 發(fā)表于 10-21 07:55 ?146次閱讀

    大數(shù)據(jù)從業(yè)者必知必會(huì)的Hive SQL調(diào)優(yōu)技巧

    不盡人意。本文針對(duì)Hive SQL的性能優(yōu)化進(jìn)行深入研究,提出了一系列可行的調(diào)優(yōu)方案,并給出了相應(yīng)的優(yōu)化案例和優(yōu)化前后的SQL代碼。通過(guò)合理的優(yōu)化策略和技巧,能夠顯著提升Hive SQL的執(zhí)行
    的頭像 發(fā)表于 09-24 13:30 ?274次閱讀

    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 ?1032次閱讀
    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 ?534次閱讀
    “Spark+<b class='flag-5'>Hive</b>”在DPU環(huán)境下的性能測(cè)評(píng) | OLAP數(shù)據(jù)庫(kù)引擎選型白皮書(24版)DPU部分節(jié)選

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

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

    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 ?953次閱讀
    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 ?1593次閱讀
    SiC器件如何<b class='flag-5'>提升</b>電動(dòng)汽車的系統(tǒng)<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