Hive執行計劃之只有map階段SQL性能分析和解讀

来源:https://www.cnblogs.com/lubians/archive/2023/06/13/17478285.html
-Advertisement-
Play Games

這種只含map的操作,如果文件大小控制在合適的情況下,都將只有本地操作,其執行非常高效,運行效率完全不輸於在計算引擎Tez和Spark上運行。 ...


目錄

目錄

概述

可能所有的SQLboy剛接觸SQL語句的時候都是select xxx from xxx where xxx。在hive中,我們把這種語句稱為select-from-where型語句,也可稱為簡單SQL,這類簡單SQL是特指不含有變轉換函數,聚合函數,開窗函數和連接操作的SQL語句。

這類SQL主要特征是只有map階段,沒有reduce階段。

本文分析一下這類簡單SQL執行計劃和性能,讓我們從最基礎的SQL分析,hive簡單語句select from where 型語句性能分析,逐漸深入,進而學會分析複雜SQL的性能和執行計劃。

所有的複雜SQL(幾百行?上千行?)都是由一個個簡單SQL帶一些特殊函數堆疊而成的。

1.不帶函數操作的select-from-where型簡單SQL

這類SQL語句通常只有select-from-where,沒有其他函數操作,或者操作符處理,例如字元串截取。

1.1執行示例

例1 不帶函數操作的select-from-where型簡單SQL。

-- 本文預設使用mr計算引擎
explain
-- 統計年齡等於30歲的所有昵稱
select age,nick from temp.user_info_all 
where ymd = '20230505'
and age = 30;

執行執行計劃結果:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: user_info_all
            Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
            Filter Operator
              predicate: (age = 30) (type: boolean)
              Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: 30 (type: bigint), nick (type: string)
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
                File Output Operator
                  compressed: true
                  Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
                  table:
                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

通過以上內容,我們可以看到,整個SQL邏輯執行過程中只有map操作樹(Map Operate Tree),若轉換成MapReduce來看的話,即只有Map階段的任務。

如果有執行計劃里關鍵詞不熟悉的,建議閱讀這篇 Hive執行計劃之一文讀懂Hive執行計劃

1.2 運行邏輯分析

以上流程我們可以分解為運行邏輯圖來看,如下圖:

我們在之前的文章中提起過,Hive執行計劃是一個預估的執行計劃,只有在SQL實際執行後才會獲取到真正的執行計劃。那我們來看看以上語句的實際運行控制台列印過程。額,失算了,因為結果太多,限制一下輸出條數。

Query ID = hdfs_20230613111158_03c8f6e1-e04f-4e4e-aa9b-569a89860438
Total jobs = 1
Launching Job 1 out of 1
# 這裡表示沒有reduce任務,reduce任務執行的伺服器節點是0個。
Number of reduce tasks is set to 0 since there's no reduce operator
...
Hadoop job information for Stage-1: number of mappers: 6; number of reducers: 0
2023-06-13 11:12:28,564 Stage-1 map = 0%,  reduce = 0%
2023-06-13 11:12:45,219 Stage-1 map = 17%,  reduce = 0%, Cumulative CPU 6.17 sec
...
2023-06-13 11:12:54,523 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 40.52 sec
MapReduce Total cumulative CPU time: 40 seconds 520 msec
Ended Job = job_1675664438694_14052273
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 6   Cumulative CPU: 40.52 sec   HDFS Read: 203436481 HDFS Write: 2412 SUCCESS
Total MapReduce CPU Time Spent: 40 seconds 520 msec

從上面的結果可以知道,實際的運行過程也是只有map階段的操作。

針對select-from-where只有map階段操作而沒有reduce階段的主要原因是這類SQL只有從表中讀取數據並執行數據行的過濾,並沒有需要將HDFS在其他節點上的數據與該節點數據放在一起處理的必要,因此這類SQL不需要reduce操作。Map階段過濾後的數據,就是最終的結果數據。

這種只含map的操作,如果文件大小控制在合適的情況下,都將只有本地操作,其執行非常高效,運行效率完全不輸於在計算引擎Tez和Spark上運行。感興趣的小伙伴可以去將三者運行效率比對一下。

1.3 偽代碼解釋

接下來我們再以mr偽代碼的方式理解一下上述語句的運行情況:

例2 MRselect-from-where簡單SQL代碼解析

map(inkey,invalue,context);
colsArray = invalue.split("\t");
//對應filter操作,過濾掉age=30的數據行,ymd為分區列,屬於文件級操作,這裡不展示了。
if int(colsArray[11]) == 30 {
  //獲取age,nick兩列,就是投影操作,即select操作
  age = colsArray[11];
  nick = colsArray[7];
  //最後輸出兩列age,nick,執行計劃中對應的為_col0和_col1.這裡invalue為1
  context.write(age,nick);
}
reduce(inkey,invalue,context)
  //pass表示不會執行
  pass;

2.帶普通函數和運行操作符的普通型SQL執行計劃解讀

這裡的普通函數特指除表轉換函數(UDTF),聚合函數和視窗函數之外的函數。例如:nvl(),cast(),case when,concat(),year()等,具體有哪些,後續會專門羅列。

這類SQL也屬於select-from-where型SQL,其主要特點也是只有map階段處理。

我們也可以給它更具體的稱為 select-function(column)-from-where-function(column)類。

2.1 執行計劃解讀

接下來可以看一個帶普通函數和操作符的SQL執行計劃案例。

例3 帶普通函數和操作符的SQL運行計劃。

explain
-- 統計年齡等於30歲的所有昵稱
select uid,
nvl(client,'android') as client,
case when age > 20 then '老腊肉' else '小鮮肉' end as label,
concat(nick,'_測試') as nick, 
cast(chat_uv as double)/10 as chat
from temp.user_info_all 
where ymd = '20230505'
and age in (18,19,20,21) and chat_uv is not null and substr(uid,0,1) = '1';

輸出的執行計劃結果:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: user_info_all
            Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
            # where 條件過濾
            Filter Operator
              predicate: ((age) IN (18, 19, 20, 21) and chat_uv is not null and (substr(uid, 0, 1) = '1')) (type: boolean)
              Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
              # 列投影
              Select Operator
                expressions: uid (type: bigint), NVL(client,'android') (type: string), CASE WHEN ((age > 20)) THEN ('老腊肉') ELSE ('小鮮肉') END (type: string), concat(nick, '_測試') (type: string), (UDFToDouble(chat_uv) / 10) (type: double)
                outputColumnNames: _col0, _col1, _col2, _col3, _col4
                Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
                File Output Operator
                  compressed: true
                  Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
                  table:
                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

通過以上執行計劃我們可以看到,這個結果同select-from-where 型SQL,只有map階段的操作,如果實際去運行以上任務,得到的執行步驟也和例1類似。即在map運行完整個作業任務結束。

結合以上實例我們可以得出一個結論 select-function(colums)-from-where-function(column)這種類型的SQL可以歸於select-from-where類簡單SQL類型。

2.2 偽代碼解釋邏輯

例4 例2的MapReduce偽代碼執行邏輯。

//整個程式只有map階段,沒有reduce邏輯
map(inkey,invalue,context);
//數據輸入是一行數據
colsArray = invalue.split("\t");
if age in (18,19,20,21) and chat_uv != null and substr(uid, 0, 1) == '1'{
  uid = colsArray[0];
  client = colsArray[3];
  if client == null{
    client = 'android';
  }
  label = '';
  if age > 20 {
    label = '老腊肉';
  } else {
    label = '小鮮肉';
  }
  nick = nick+'_測試');
  chat = double(chat_uv)/10;
}
context.write(uid,client+'\t'+label+'\t'+nick+'\t'+chat);

下一期:Hive常見時間函數的使用與問題整理

按例,歡迎點擊此處關註我的個人公眾號,交流更多知識。

後臺回覆關鍵字 hive,隨機贈送一本魯邊備註版珍藏大數據書籍。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CS5366內部集成了PD3.0及DSC decoder,應用Type-C轉HDMI2.0的顯示協議轉換晶元, 簡介: CS5366系列提供了USB Type-C(DisplayPort Alternate Mode)到HDMI轉換器的單晶元解決方案,帶有電源傳輸。CS5366系列支持一個USB T ...
  • 參考帖子:https://blog.csdn.net/freedompoi/article/details/122350866 目前想要實現STM32F4自帶的DMA雙緩衝區,嘗試過一版,結果不能預期,就使用了RxHalfCplt和RxCplt去實現DMA雙緩衝區的效果。 現在有時間了,又重新實現S ...
  • ## 介紹 windows系統自帶的遠程桌面連接相對市面上其他的遠程軟體而言有他的優點: 1. 免費 2. 連接穩定 3. 操作流暢,幾乎沒有遠程辦公的卡滯感 但是,唯一的缺點是連接的電腦之間必須使用一個區域網,也就是說比較適合校園、企業用戶。以校園為例進行講解。 ## 使用前提 1. 連接及被連接 ...
  • # 文件系統 > 文件是面向OS和麵向使用者而言的,對於人來說,音樂,圖片,文檔,游戲,軟體,郵件,等記錄信息的載體都被操作系統統稱為文件,而存儲在HDD(機械硬碟)和SSD(固態硬碟)里.因此文件是一種實體的抽象,而之所以文件需要文件名,是因為不同的文件需要進行相對應的區分,也就是文件名,而其中的 ...
  • # region Region是HBase數據管理的基本單位,region有一點像關係型數據的分區。 Region中存儲這用戶的真實數據,而為了管理這些數據,HBase使用了RegionSever來管理region。 ## region的分配 一個表中可以包含一個或多個Region。 每個Regio ...
  • 事務隔離級別遺留問題: 在讀已提交的級別下,事務B可以讀到事務A持有寫鎖的的記錄,且讀到的是未更新前的,為何寫讀沒有衝突? 可重覆讀級別,事務B可以更新事務A理論上應該已經獲取讀鎖的記錄,且更新後,事務A依然可以讀到數據,為何讀-寫-讀沒有衝突? 在可重覆讀級別,幻讀沒有產生 其中,前兩個問題就是因 ...
  • 企業數字化轉型以數據為中心,通過數據驅動業務發展、管理協同和運營。因此,數字化轉型關鍵在於數據,數據治理則需先行。從而更好激發數據生產要素潛能,實現業務數據化、數據價值化,助力企業數字化轉型。 ## 那麼何為數據治理? 國際數據管理協會(DAMA)在其《DAMA數據管理知識體系指南(第2版)》一書中 ...
  • # 資料庫模式設計如果不好會導致的問題: 1.冗餘 2.導致數據一致性出現問題 3.插入異常 4.更新異常 5.刪除異常 # 函數依賴 函數依賴是指一個或多個屬性的取值可以確定另一個屬性的取值。具體地說,如果一個關係模式R中屬性集合X的取值能唯一地確定屬性集合Y的取值,那麼我們稱屬性集合Y對於屬性集 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...