點選上方藍色字型,選擇“設為星标”
回複”資源“擷取更多資源
大資料技術與架構 點選右側關注,大資料開發領域最強公衆号!
大資料真好玩 點選右側關注,大資料真好玩!
往期回顧:
Hive性能調優 | Fetch抓取
Hive性能調優 | 資料傾斜
并行執行
set hive.exec.parallel=true; //打開任務并行執行
set hive.exec.parallel.thread.number=16; //同一個sql允許最大并行度,預設為8。
當然,得是在系統資源比較空閑的時候才有優勢,否則,沒資源,并行也起不來。
嚴格模式
Hive提供了一個嚴格模式,可以防止使用者執行“高危”的查詢。
通過設定屬性hive.mapred.mode值為預設是非嚴格模式nonstrict 。開啟嚴格模式需要修改hive.mapred.mode值為strict,開啟嚴格模式可以禁止3種類型的查詢。
hive.mapred.modestrict
The mode in which the Hive operations are being performed.
In strict mode, some risky queries are not allowed to run. They include:
Cartesian Product.
No partition being picked up for a query.
Comparing bigints and strings.
Comparing bigints and doubles.
Orderby without limit.
- 對于分區表,使用者不允許掃描所有分區,除非where語句中含有分區字段過濾條件來限制範圍,否則不允許執行。進行這個限制的原因是,通常分區表都擁有非常大的資料集,而且資料增加迅速。沒有進行分區限制的查詢可能會消耗令人不可接受的巨大資源來處理這個表。
- 對于使用了order by語句的查詢,要求必須使用limit語句。因為order by為了執行排序過程會将所有的結果資料分發到同一個Reducer中進行處理,強制要求使用者增加這個LIMIT語句可以防止Reducer額外執行很長一段時間。
- 限制笛卡爾積的查詢。對關系型資料庫非常了解的使用者可能期望在執行JOIN查詢的時候不使用ON語句而是使用where語句,這樣關系資料庫的執行優化器就可以高效地将WHERE語句轉化成那個ON語句。不幸的是,Hive并不會執行這種優化,是以,如果表足夠大,那麼這個查詢就會出現不可控的情況。
JVM重用
JVM重用是Hadoop調優參數的内容,其對Hive的性能具有非常大的影響,特别是對于很難避免小檔案的場景或task特别多的場景,這類場景大多數執行時間都很短。
Hadoop的預設配置通常是使用派生JVM來執行map和Reduce任務的。這時JVM的啟動過程可能會造成相當大的開銷,尤其是執行的job包含有成百上千task任務的情況。JVM重用可以使得JVM執行個體在同一個job中重新使用N次。N的值可以在Hadoop的mapred-site.xml檔案中進行配置。通常在10-20之間,具體多少需要根據具體業務場景測試得出。
mapreduce.job.jvm.numtasks10How many tasks to run per jvm. If set to -1, there is
no limit.
我們也可以在hive當中通過
set mapred.job.reuse.jvm.num.tasks=10;
這個設定來設定我們的jvm重用 當然,這個功能也是有它的缺點的。開啟JVM重用将一直占用使用到的task插槽,以便進行重用,直到任務完成後才能釋放。如果某個“不平衡的”job中有某幾個reduce task執行的時間要比其他Reduce task消耗的時間多的多的話,那麼保留的插槽就會一直空閑着卻無法被其他的job使用,直到所有的task都結束了才會釋放。
推測執行
在分布式叢集環境下,因為程式Bug(包括Hadoop本身的bug),負載不均衡或者資源分布不均等原因,會造成同一個作業的多個任務之間運作速度不一緻,有些任務的運作速度可能明顯慢于其他任務(比如一個作業的某個任務進度隻有50%,而其他所有任務已經運作完畢),則這些任務會拖慢作業的整體執行進度。為了避免這種情況發生,Hadoop采用了推測執行(Speculative Execution)機制,它根據一定的法則推測出“拖後腿”的任務,并為這樣的任務啟動一個備份任務,讓該任務與原始任務同時處理同一份資料,并最終選用最先成功運作完成任務的計算結果作為最終結果。
Hive 同樣可以開啟推測執行
設定開啟推測執行參數:Hadoop的mapred-site.xml檔案中進行配置
mapreduce.map.speculativetrueIf true, then multiple instances of some map tasks
may be executed in parallel.
mapreduce.reduce.speculativetrueIf true, then multiple instances of some reduce tasks
may be executed in parallel.
不過hive本身也提供了配置項來控制reduce-side的推測執行:
hive.mapred.reduce.tasks.speculative.executiontrueWhether speculative execution for reducers should be turned on.
關于調優這些推測執行變量,還很難給一個具體的建議。如果使用者對于運作時的偏差非常敏感的話,那麼可以将這些功能關閉掉。如果使用者因為輸入資料量很大而需要執行長時間的map或者Reduce task的話,那麼啟動推測執行造成的浪費是非常巨大大。
版權聲明:
本文為大資料技術與架構整理,原作者獨家授權。未經原作者允許轉載追究侵權責任。 編輯|冷眼丶 微信公衆号|import_bigdata 歡迎點贊+收藏+轉發朋友圈素質三連
文章不錯?點個【在看】吧! ?