那曲檬骨新材料有限公司

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

    文章

    7145

    瀏覽量

    89591
  • hive
    +關注

    關注

    0

    文章

    12

    瀏覽量

    3863

原文標題:Hive 提高查詢效率的八條軍規

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    八個方面提升LED驅動電源效率

    關于提升LED驅動電源效率的技巧總結: 1.主電流回路PCB盡量短。LAYPCB的經驗,及布局,這個沒什么,快速的方法就是多看別人的作品。 2.優化變壓器參數設計,減少振鈴帶來的渦流損耗。這個比較
    發表于 01-17 10:07

    怎么提升單片機代碼執行效率

    ? 提升單片機代碼執行效率需要從多個方面入手,包括代碼優化、硬件資源利用、編譯器設置、中斷處理優化以及其他技巧等。在實際應用中,需要根據具體需求和硬件條件綜合考慮這些因素,以實現最佳的性能表現。 ?
    的頭像 發表于 01-10 11:06 ?157次閱讀

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

    在現代軟件開發中,編譯器扮演著至關重要的角色。它們不僅將高級語言代碼轉換為機器可執行的代碼,還通過各種優化技術提升程序的性能。Triton 編譯器作為一種先進的編譯器,通過多種方式提升編程效率,使得
    的頭像 發表于 12-25 09:12 ?337次閱讀

    如何使SOLIDWORKS參數化設計軟件提升效率

    SOLIDWORKS參數化設計軟件-SolidKits.AutoWorks可實現智能選型、自動化修改產品屬性、產品參數、產品狀態、圖紙更新、重命名、并自動打包生成交付物,實現產品自動設計。大幅提升設計效率,減少錯誤、降低對人工經驗的要求和用人成本。
    的頭像 發表于 12-19 15:53 ?416次閱讀

    永磁同步電機效率提升方法

    提升永磁同步電機效率的方法可以從多個方面進行,以下是一些有效的方法: 優化電機設計 : 增加磁場的強度:通過增加永磁體的磁通密度和提高永磁體及鐵心的磁導率,可以有效提升電機的磁場強度,從而提高
    的頭像 發表于 11-22 10:13 ?586次閱讀

    高效生產秘訣:掌握提升SMT貼片效率的拼板設計技巧

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

    如何提升EDA設計效率

    EDA(Electronic Design Automation,電子設計自動化)設計技術是現代電子工程領域的關鍵技術之一,提升EDA設計效率對于電子工程師和整個電子行業都至關重要。以下是一些提升
    的頭像 發表于 11-08 14:23 ?574次閱讀

    提升效率:RTC時鐘實用設置

    今天來給大家講解的是RTC時鐘實用性,提升絕對的效率
    的頭像 發表于 11-04 16:35 ?909次閱讀
    <b class='flag-5'>提升</b><b class='flag-5'>效率</b>:RTC時鐘實用設置

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

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

    大數據從業者必知必會的Hive SQL調優技巧

    不盡人意。本文針對Hive SQL的性能優化進行深入研究,提出了一系列可行的調優方案,并給出了相應的優化案例和優化前后的SQL代碼。通過合理的優化策略和技巧,能夠顯著提升Hive SQL的執行
    的頭像 發表于 09-24 13:30 ?330次閱讀

    ClickHouse內幕(3)基于索引的查詢優化

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

    “Spark+Hive”在DPU環境下的性能測評 | OLAP數據庫引擎選型白皮書(24版)DPU部分節選

    在奇點云2024年版《OLAP數據庫引擎選型白皮書》中,中科馭數聯合奇點云針對Spark+Hive這類大數據計算場景下的主力引擎,測評DPU環境下對比CPU環境下的性能提升效果。特此節選該章節內容,與大家共享。
    的頭像 發表于 05-30 16:09 ?583次閱讀
    “Spark+<b class='flag-5'>Hive</b>”在DPU環境下的性能測評 | OLAP數據庫引擎選型白皮書(24版)DPU部分節選

    光伏并網逆變器如何提升轉換效率

    提升光伏并網逆變器的轉換效率是光伏系統優化和提高經濟效益的重要途徑。
    的頭像 發表于 04-18 16:39 ?1390次閱讀

    AGV小車 | 提升倉儲物流運營效率的好幫手

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

    SiC器件如何提升電動汽車的系統效率

    SiC器件可以提高電動汽車的充電模塊性能,包括提高頻率、降低損耗、縮小體積以及提升效率等。這有助于提升電動汽車的整體性能表現。
    的頭像 發表于 03-18 18:12 ?1651次閱讀
    SiC器件如何<b class='flag-5'>提升</b>電動汽車的系統<b class='flag-5'>效率</b>
    澳门百家乐必胜看路| 职业赌百家乐技巧| 百家乐推广| 苹果百家乐的玩法技巧和规则| 威尼斯人娱乐城可靠吗| 金宝博娱乐城返水| 百家乐官网赚钱项目| 澳门百家乐官网的公式| 游戏百家乐官网的玩法技巧和规则| 百家乐视频双扣| 百家乐技巧经| 明陞M88| 百家乐官网概率统计| 赌百家乐的体会| JJ百家乐的玩法技巧和规则| 京城娱乐城| 百家乐官网一柱擎天| 百家乐官网赌场彩| 百家乐正反投注| 大发888赢钱最多的| 北京太阳城医院| 百家乐官网网上公式| 金博士百家乐官网的玩法技巧和规则| 百家乐赌博代理| 宝胜娱乐| 长沙百家乐官网的玩法技巧和规则 | 永利高百家乐官网开户| 网上百家乐危险| 申烨太阳城三期| 百家乐官网网页游戏网址| 百家乐输一压二| 大发888网络赌博害人| 百家乐官网有好的投注法吗| 百家乐赌博是否违法| 娱乐城体验金| 机器百家乐官网软件| 悍马百家乐的玩法技巧和规则| 澳门百家乐官网门路| 太阳城百家乐网上| 六合彩大全| 网上百家乐官网试玩网址|