HiveSql調優系列之Hive嚴格模式,如何合理使用Hive嚴格模式

来源:https://www.cnblogs.com/lubians/archive/2022/09/02/16650960.html
-Advertisement-
Play Games

所謂Hive的嚴格模式,就是為了避免用戶提交一些惡意SQL,消耗大量資源進而使得運行環境崩潰做出的一些安全性的限制。 ...


目錄

綜述

在同樣的集群運行環境中,hive調優有兩種方式,即參數調優和sql調優

本篇講涉及到的Hive嚴格模式。

前兩天在優化一個前人遺留下的sql,發現關於嚴格模式參數是這樣使用的,嚴重錯誤。

set hive.strict.checks.cartesian.product=flase;
set hive.mapred.mode=nonstrict;

而且我發現在使用參數上,無論sql大小直接貼一堆參數,類似這樣。

set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16;
set hive.merge.mapfiles = true; 
set hive.merge.mapredfiles = true; 
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize = 256000000;
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000; 
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.join.emit.interval = 2000;
set hive.mapjoin.size.key = 20000;
set hive.mapjoin.cache.numrows = 20000;
set hive.exec.reducers.bytes.per.reducer=2000000000;
set hive.exec.reducers.max=999;
set hive.map.aggr=true;
set hive.groupby.mapaggr.checkinterval=100000;
set hive.auto.convert.join = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.dynamic.partition = true;
set hive.cli.print.header=true;
set hive.resultset.use.unique.column.names=false;
set mapreduce.reduce.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx4096m;
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000; 

優化是優化了,但是我看到了優化的無目標性,反而在一定程度上多消耗了計算資源。

於是打算開一個系列文章,Hive SQL調優系列,如何合理的使用參數進行SQL優化,針對什麼情況使用哪些參數優化。

本篇先說說嚴格模式相關參數怎麼使用。

正文如下。

1.嚴格模式

所謂Hive的嚴格模式,就是為了避免用戶提交一些惡意SQL,消耗大量資源進而使得運行環境崩潰做出的一些安全性的限制。

或多或少我們都提交過一些執行很久,集群資源不足的SQL。應該能理解。

前文Hive動態分區詳解中有提到過

1.1 參數設置

-- strict 為開啟嚴格模式  nostrict 關閉嚴格模式
set hive.mapred.mode=strict

1.2 查看參數

通過hive的set 查看指定參數

-- 黑視窗查看Hive模式,以下結果為未開啟嚴格模式
hive> set hive.mapred.mode;
hive.mapred.mode is undefined

1.3 嚴格模式限制內容及對應參數設置

如果Hive開啟嚴格模式,將會阻止一下三種查詢:

a.對分區表查詢,where條件中過濾欄位沒有分區欄位;

b.對order by查詢,order by的查詢不帶limit語句。

c.笛卡爾積join查詢,join查詢語句中不帶on條件或者where條件;

以上三種查詢情況也有自己單獨的參數可以進行控制。

  • 分區表查詢必須指定分區
-- 開啟限制(預設為 false)
set hive.strict.checks.no.partition.filter=true;
  • orderby排序必須指定limit
-- 開啟限制(預設為false)
set hive.strict.checks.orderby.no.limit=true;
  • 限制笛卡爾積運算
-- 開啟限制(預設為false)
set hive.strict.checks.cartesian.product=true;

2.實際操作

2.1 分區表查詢時必須指定分區

分區表查詢必須指定分區的原因:如果該表有大量分區,如果不加限制,在讀取時會讀取到超出預估的數據量。

-- 測試
create table `lubian` (
`id` string comment 'id',
`name` string comment '姓名'
)
comment 'lubian' 
PARTITIONED BY (ymd string)
row format delimited fields terminated by '\t' lines terminated by '\n' 
stored as orc;

set hive.strict.checks.no.partition.filter=true;
select * from lubian limit 111;

執行結果

FAILED: SemanticException [Error 10056]:
    Queries against partitioned tables without a partition filter are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.no.partition.
    filter to false and make sure that hive.mapred.mode is not set to 'strict' to proceed.
    Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.
    No partition predicate for Alias "lubian" Table "lubian"

select * from partab where dt='11' limit 111;
Time taken: 0.77 seconds

2.2 order by必須指定limit

order by必須指定limit的主要原因: order by 為全局排序,所有數據只有一個reduceTask來處理,防止單個reduce運行時間過長,而導致任務阻塞

-- 測試
set hive.strict.checks.orderby.no.limit=true;
select * from lubian order by name;

執行結果

FAILED: SemanticException 1:36
    Order by-s without limit are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.orderby.no.limit to false
    and make sure that hive.mapred.mode is not set to 'strict' to proceed.
    Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features..
    Error encountered near token 'name'

2.3 限制笛卡爾積

限制笛卡爾積運算原因:笛卡爾積可能會造成數據急速膨脹,例如兩個1000條數據表關聯,會產生100W條數據。n的平方增長。觸發笛卡爾積時,join操作會在一個reduceTask中執行

-- 測試
set hive.strict.checks.cartesian.product=true;
select t1.*,t2.* from lubian as t1
inner join lubian as t2;

執行結果

FAILED: SemanticException Cartesian products are disabled for safety reasons.
    If you know what you are doing, please set hive.strict.checks.cartesian.product to false
    and make sure that hive.mapred.mode is not set to 'strict' to proceed.
    Note that you may get errors or incorrect results
    if you make a mistake while using some of the unsafe features.

3.搭配使用

3.1 參數

設置hive嚴格模式參數如下

set hive.mapred.mode=strict;
set hive.strict.checks.no.partition.filter=true;
set hive.strict.checks.orderby.no.limit=true;
set hive.strict.checks.cartesian.product=true;

以上參數可以使用 set hive.mapred.mode=strict; 預設開啟三種情況的嚴格模式。也可以使用每個限制內容參數開啟指定嚴格校驗。

3.2 搭配使用案例

也可以搭配使用,但是使用以下方式就有些問題了:

-- 關閉笛卡爾積運算校驗
set hive.strict.checks.cartesian.product=flase;
-- 關閉嚴格模式
set hive.mapred.mode=nonstrict;

應該是嚴格模式預設關閉,但仍想對其中一種情況做校驗。如下

set hive.mapred.mode=nonstrict;
set hive.strict.checks.cartesian.product=true;

或者嚴格模式預設開啟,但對其中一種不想做校驗:

set hive.mapred.mode=strict;
set hive.strict.checks.cartesian.product=false;

以上內容。

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

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


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

-Advertisement-
Play Games
更多相關文章
  • iOS發佈證書用於上架App Store,當開發好APP後需要上架時要用iOS下底證書有p12和mobileprovision兩份文件包裝! 只有用iOS發佈證書包裝的ipa可以上傳到App Store。 一、申請iOS發行證書(p12文件) 使用Appuploader軟體申請可以幫助您在Windo ...
  • Linux-crontab 定時任務設置 crontab 是一個命令,常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。 用法 crontab [-u user] file crontab [ -u user ] [ -i ] { -e | -l | -r } 參數 -e - 編 ...
  • ♦ 新標準介紹 IEC 60884-1:2022《Plugs and socket-outlets for household and similar purposes - Part 1: General requirements》已於2022年08月04日正式發佈。 本第四版取代了IEC 6088 ...
  • 三國誌11是一款十分經典的策略類游戲,三國誌11威力加強版是《三國誌11》的擴充強化版本,能夠讓已經體驗過《三國誌11》的玩家可以享受到更豐富的游戲內容。採用了氣勢滂沱的水墨風格,同時還追加全新的6段劇情。 詳情:三國誌11威力加強版 for Mac(三國策略游戲) 《三國誌11威力加強版》是日本光 ...
  • Mac投屏軟體怎麼安裝?AIrServer是一款ios投屏到mac的專用軟體,可將iOS上的音頻,視頻,照片,幻燈片和鏡像接收功通過AIrPlay投射到Mac。AIrserver 7 mac版可以實現將手機上的媒體文件以及其他操作投射到電腦上進行操作。使用AIrServer,您現在可以從Mac,iO ...
  • LightWave 3D Mac版是專為Mac用戶設計的三維動畫製作軟體,功能強大,操作簡便,易學易用,無論是初學者還是專業人士都可以滿足所有需求!LightWave 3D 被廣泛應用於電子游戲開發、電視、電影、網頁、廣告、以及印刷圖形和設計等領域。 詳情:LightWave 3D 2020 for ...
  • 本教程主要介紹如何在 Windows 系統上實現 Spire.Cloud 私有化部署。 詳細步驟如下: 一、安裝依賴 我們的私有部署的依賴有 Nodejs、MySQL、Redis 和 RabbitMQ。請確認伺服器安裝了 Nodejs、MySQL、Redis 和 RabbitMQ。 二、部署 Spi ...
  • 排座位問題的思路 表: Seat + + + | Column Name | Type | + + + | id | int | | name | varchar | + + + Id是該表的主鍵列。 該表的每一行都表示學生的姓名和ID。 Id是一個連續的增量。 編寫SQL查詢來交換每兩個連續的學生 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...