<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Hive編程指南》讀書筆記

      前言:

      最近剛接觸寫Hive SQL,卻發現許多查詢的執行速度遠不如預期。為了提升查詢效率,我去閱讀了《Hive編程指南》,希望通過理解其底層機制來找到優化的方式,并為未來能編寫出高效的SQL奠定基礎。謹以此文做個記錄。

      一、Hive因何而生

      先有Hadoop再有Hive

      Hadoop實現了一個計算模型——MapReduce,它可以將計算任務分割成多個處理單元然后分散到一群家用的或服務器級別的硬件機器上,從而降低計算成本并提供水平可伸縮性。但是這套編程模型對于大多數數據分析分析師較為復雜和地銷,即便是Java開發編寫MapReduce程序也需要很多時間和精力。基于此,Hive提供了基于SQL的查詢語言(HiveQL),這邊能夠讓擁有SQL知識的用戶能夠輕松使用Hadoop進行大數據分析,因為Hive的底層會自動將這些查詢轉換為MapReduce任務。

      二、Hive組成模塊

       

       

       

      所有的命令和查詢都會進入Driver,通過該模塊對輸入進行解析編譯,對需求的計算進行優化,然后按照指定的步驟執行。

      Hive通過JobTracker通信來初始化MapReduce任務,需要處理的數據文件是存儲在HDFS中的,而HDFS是由NameNode進行管理的。

      Metastore(元數據存儲)是一個獨立的關系型數據庫,Hive會在其中保存表模式和其他系統元數據。

      三、HQL執行流程

       

       

      簡單來說,Hive會從Hadoop分布式文件系統(HDFS)中讀取原始數據,然后根據查詢定義,在單節點(本地模式)或者Hadoop集群上(集群模式)執行數據處理。處理完成后,Hive會將結果輸出到HDFS或者其他指定的存儲位置。

      那么,Hive的執行時間主要花費在哪兒呢?我們可優化的部分是哪部分?

      Hive的執行時間主要花費在以下幾個階段:

      1.查詢編譯:Hive 將 HiveQL 查詢編譯成一個邏輯執行計劃,這個計劃描述了如何執行查詢。此階段包括語法分析、語義分析、生成邏輯計劃、邏輯計劃優化和生成物理計劃(通常是 MapReduce 作業)。
      2.任務調度:編譯生成的 MapReduce 作業被提交到 Hadoop 集群的資源管理器(如 YARN),等待資源調度和作業執行。
      3.數據讀寫:讀取存儲在 HDFS 上的數據以及寫入最終結果到 HDFS,這個過程涉及大量的磁盤 I/O 操作,尤其是在處理大量數據集時。
      4.MapReduce 作業執行:包括
      1.Map 階段:執行過濾、投影等操作;
      2.Shuffle 階段:Map 任務輸出的中間數據在網絡上傳輸并在 Reduce 節點上進行排序和合并;
      3.Reduce 階段:執行聚合、排序等操作;
      5.網絡傳輸:在 MapReduce 的 Shuffle 階段,中間數據需要在集群節點之間傳輸,這可能導致顯著的網絡延遲。

      通常,MapReduce 作業的執行時間(尤其是 Shuffle 和 Reduce 階段)以及數據的讀寫操作是 Hive 查詢中最耗時的部分,也是我們優化過程中主要關注的部分,接下來我們看下有哪些常見的優化方式。

      四、Hive常見的優化方式

      本地模式

      -- 開啟本地模式,默認為false
      hive.exec.mode.local.auto=true
      
      原理:有時Hive的輸入數據量是非常小的。在這種情況下,為查詢觸發執行任務的時間消耗可能會比實際job的執行時間要多得多。對于大多數這種情況,Hive可以通過本地模式在單臺機器上處理所有的任務。對于小數據集,執行時間可以明顯被縮短。用戶可以通過設計屬性
      hive.exec.mode.local.auto的值為true,來讓Hive在適當的時候自動啟動這個優化。實踐有效,但如果并行執行的SQL過多,容易造成本地內存溢出。
      
      

       

      map-side JOIN優化

      #-- Hive v0.7之前需要通過添加標記 /*+ MAPJOIN(X) */ 觸發,如下圖

       

       

       

      -- Hive v0.7版本開始之后,通過設置hive.auto.convert.JOIN的值為true開啟
      set hive.auto.convert.JOIN=true
      -- 設置小表的大下,單位為字節
      set hive.mapjoin.smalltable.filesize=25000000
      
      原理:如果所有表中有一個表足夠得小,是可以完成載入內存中的,那么這時Hive可以執行一個map-side JOIN,將小表完全放到內存,Hive便可以直接和內存中的小表進行逐一匹配,從而減少所需要的reduce過程,有時甚至可以減少某些map task任務。
      
      

      并發執行

      -- 通過設置參數hive.exec.parallel值為true,開啟并發執行,默認為false
      set hive.exec.parallel=true
      
      原理:Hive會將一個查詢轉化成一個或者多個階段。這樣的階段可以是MapReduce階段、抽樣階段、合并階段、limit階段等。默認情況下,Hive一次只會執行一個階段。但是有些階段并非完全互相依賴的,也就是說這些階段是可以并行執行的,這樣可以使得整個job的執行時間縮短。
      通過設置參數hive.exec.parallel值為true,就可以開啟并發執行。 
      
      

      動態分區調整

      -- 啟用動態分區,默認為false;
      SET hive.exec.dynamic.partition=true;
      -- 啟用動態分區模式為非嚴格模式。開啟嚴格模式時們必須保證至少有一個分區時靜態的。
      SET hive.exec.dynamic.partition.mode=nonstrict;
      -- 設置在一個動態分區插入操作中可以創建的最大分區數量
      SET hive.exec.max.dynamic.partitions=1000;
      -- 設置每個節點可以創建的最大分區數量
      SET hive.exec.max.dynamic.partitions.pernode=100;
      
      當執行查詢時,如果查詢條件包含分區鍵,Hive可以僅掃描相關分區的數據,從而減少了掃描的數據量,提高查詢效率;在執行動態分區的插入時,這些分區也可以并行寫入,從而提高了數據寫入的并行度和性能。通過以上參數,可更好的使用動態分區。
      
      

      合并小文件

      --是否和并Map輸出文件,默認true
      SET hive.merge.mapfiles=true;
      --是否合并 Reduce 輸出文件,默認false
      SET hive.merge.mapredfiles=true;
      -- 設置合并文件的大小閾值
      SET hive.merge.size.per.task=256000000; 
      -- 設置小文件的平均大小閾值
      SET hive.merge.smallfiles.avgsize=128000000; 
      
      由于一些小批量的寫入、MapReduce作業切割、數據傾斜等原因,Hive中可能會產生大量小文件,通過以上參數可進行小文件合并以減少讀取文件時的開銷、降低NameNode壓力,提升查詢效率。
      
      

      數據傾斜優化

      數據傾斜指的是在分布式處理過程中,數據不均勻地分配給各個節點處理,導致部分節點負載過重,而其他節點負載輕松,從而影響整體計算效率。數據傾斜出現的原因主要如下:

      1.鍵值分布不均勻:有些鍵值對應的數據遠多于其他鍵值;
      2.量相同鍵值:大量數據使用相同的鍵(如null或者特定的默認值)進行分組;
      3.不合理的JOIN操作:在JOIN大表時,如果小表的某個鍵值在大表中分布不均,導致JOIN后的結果傾斜;
      4.不合理的分區策略:數據分區時沒有考慮數據的實際分布,導致分區不均勻。

      主要解決方案有:

      1.自定義分區策略:實現自定義分區期,根據數據的特點進行更合理的分區;
      2.擴展鍵值:對傾斜的鍵添加隨機前綴或編號,使其分散到多個分區;
      3.過濾大鍵值數據:識別出傾斜的鍵值(如null、空值)進行單獨處理或過濾掉不重要的數據。

       

      最后就是我們關系型數據庫常用的優化方式同樣也適用與Hive。例如通過使用小表關聯大表的方式減少查詢數據量,提高查詢效率;Hive同樣也有索引的概念,通過建立索引減少MapReduce的輸入數據量,但同樣和關系型數據庫一樣,是否使用索引需要進行仔細評估,因為維護索引也需要額外的存儲空間,而且創建索引同樣消耗計算資源;Hive同樣也有EXPLAIN關鍵字,用于查詢Hive時如何將查詢轉化為MapReduce任務的,使用EXPLAIN EXTENDED語句可以產生更多的輸出信息,有興趣大家可自行查看。

      總體而言,這本書對于剛入門學習寫HQL的我來說收獲很大,讓我初步對Hive有了基本的認知,也讓我對我寫的SQL有了更深入的了解。但是該書中的Hive應該版本比較低了,和我們現在所使用的可能有所偏差,不過入個門足夠了。本文除了書中內容還有些我個人理解,如有錯誤,歡迎指正。

      作者: 馬壯

      來源:京東云開發者社區 轉載請注明來源

       

      posted @ 2024-01-25 11:27  京東云技術團隊  閱讀(52)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美白妞大战非洲大炮| 麻豆国产传媒精品视频| 一区二区亚洲精品国产精 | 亚洲男人AV天堂午夜在| 国产日韩综合av在线| 丰满少妇高潮无套内谢| 东北妇女精品bbwbbw| 亚洲欧美色综合影院| 精品人妻一区二区| 色九月亚洲综合网| 亚洲 丝袜 另类 校园 欧美| 在线a亚洲老鸭窝天堂| 男女高潮喷水在线观看| 亚洲精品漫画一二三区| 久久亚洲国产精品五月天| 又粗又大又黄又硬又爽免费看| 久久蜜臀av一区三区| 欧美做受视频播放| 久久夜色国产噜噜亚洲av| 综合偷自拍亚洲乱中文字幕| 精品久久久久久无码人妻蜜桃| 国产熟女一区二区三区蜜臀| 大陆精大陆国产国语精品| 国产网红女主播精品视频| 国产视色精品亚洲一区二区| 国内精品无码一区二区三区| 极品少妇的粉嫩小泬看片| 国产AV巨作丝袜秘书| 欧美亚洲另类自拍偷在线拍| 长武县| 精品国产精品中文字幕| 国产三级精品片| 丰宁| 国产91色综合久久高清| 人妻丝袜AV中文系列先锋影音| 噜噜综合亚洲av中文无码| 亚洲码与欧洲码区别入口| 成人精品一区日本无码网| 国产精品69人妻我爱绿帽子| 松阳县| 亚洲欧美人成电影在线观看|