眾所周知,現在企業在招聘大資料開發工程師的時候,都會要求你會相關元件的優化,那麼作為大資料常用的元件之一的hive,在面試時一般會問到哪些優化方面的問題勒?
1.hive優化有哪些?
join、map與reduce數量、jvm重用三個方向
•解決資料傾斜問題
•減少job數
•設定合理的map reduce的task數,能有效提公升效能。
•了解資料分布,自己動手解決資料傾斜問題是個不錯的選擇
•資料量較大的情況下,慎用count(distinct)。
•對小檔案進行合併,是行至有效的提高排程效率的方法。
•優化時把握整體,單個作業最優不如整體最優
具體方法有:
資料儲存及壓縮。
通過調參優化。
並行執行,調節parallel引數;
調節jvm引數,重用jvm;
設定map、reduce的引數;
開啟strict mode模式;
關閉推測執行設定。
有效地減小資料集
將大表拆分成子表;
結合使用外部表和分割槽表。
sql優化
大表對大表:儘量減少資料集,可以通過分割槽表,避免掃瞄全表或者全欄位;
大表對小表:設定自動識別小表,將小表放入記憶體中去執行。
2.hive調優手段有哪些?
(1)利用列裁剪
當待查詢的表字段較多時,選取需要使用的字段進行查詢,避免直接 select *出大表的所有字段,以免當使用 beeline 查詢時控制台輸出緩衝區被大資料量撐爆。(2)join 避免笛卡爾積
(2)join 避免笛卡爾積
join 場景應嚴格避免出現笛卡爾積的情況。參與笛卡爾積 join 的兩個表,交叉關聯後的資料條數是兩個原表記錄數之積,對於 join 後還有聚合的場景而言,會導致reduce 端處理的資料量暴增,極大地影響執行效率。以下左圖為笛卡爾積,右圖為正常 join。以下左圖為笛卡爾積,右圖為正常 join。
(3)啟動謂詞下推
謂詞下推(predicate pushdown)是乙個邏輯優化:盡早的對底層資料進行過濾以減少後續需要處理的資料量。通過以下引數啟動謂詞下推。
(4)開啟 map 端聚合功能
在 map 中會做部分聚集操作,能夠使 map 傳送給 reduce 的資料量大大減少,從而在一定程度上減輕 group by 帶來的資料傾斜。通過以下引數開啟 map 端聚合功能。
(5)使用 hive 合併輸入格式
設定 hive 合併輸入格式,使 hive 在執行 map 前進行檔案合併,使得本輪 map 處理資料量均衡。通過以下引數設定 hive 合併輸入格式。
(6)合併小檔案
啟動較多的 map 或 reduce 能夠提高併發度,加快任務執行速度;但同時在 hdfs 上生成的檔案數目也會越來越多,給 hdfs 的 namenode 造成記憶體上壓力,進而影響 hdfs 讀寫效率。對於集群的小檔案(主要由 hive 啟動的 mr 生成)過多已造成 namenode 壓力時,建議在 hive 啟動的 mr 中啟動小檔案合併。小檔案合併能夠使本輪 map 輸出及整個任務輸出的檔案完成合併,保證下輪mapreduce 任務 map 處理資料量均衡。
(7)解決 group by 造成的資料傾斜
通過開啟 group by 傾斜優化開關,解決 group by 資料傾斜問題。開啟優化開關後 group by 會啟動兩個 mr。第乙個 mr job 中,map 的輸出結果集合會隨機分布到 reduce 中,每個 reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 group by key 有可能被分發到不同的 reduce 中,從而達到負載均衡的目的;第二個 mr job 再根據預處理的資料結果按照 group by key 分布到 reduce 中(這個過程可以保證相同的 group by key 被分布到同乙個 reduce 中),最後完成最終的聚合操作。
8)解決 join 造成的資料傾斜
兩個表關聯鍵的資料分布傾斜,會形成 skew join。
解決方案是將這類傾斜的特殊值(記錄數超過 hive.skewjoin.key 引數值)不落入 reduce 計算,而是先寫入 hdfs,然後再啟動一輪 mapjoin 專門做這類特殊值的計算,期望能提高計算這部分值的處理速度。設定以下引數。
(9)合理調整 map 和 reduce 的記憶體及虛擬核數
map 和 reduce 的記憶體及虛擬核數設定,決定了集群資源所能同時啟動的 container 個數,影響集群平行計算的能力。
對於當前任務是 cpu 密集型任務(如複雜數學計算)的場景:在 map 和 reduce 的虛擬核數預設值基礎上,逐漸增大虛擬核數進行除錯(mapreduce.map.cpu.vcores 和 mapreduce.reduce.cpu.vcores 引數控制),但不要超過可分配給 container 的虛擬核數(yarn.nodemanager.resource.cpu-vcores 引數控制)。對於當前任務是記憶體密集型任務(如 orc 檔案讀取/寫入、全域性排序)的場景:在map 和 reduce 的記憶體預設值基礎上,逐漸增大記憶體值進行除錯(mapreduce.map.memory.mb 和mapreduce.reduce.memory.mb 引數控制),但不要超過當前 nodemanager 上可執行的所有容器的物理記憶體總大小(yarn.nodemanager.resource.memory-mb 引數控制)。
(10)合理控制 map 的數量,map 的數量會影響 mapreduce 掃瞄、過濾資料的效率。
對於掃瞄、過濾資料的邏輯比較複雜、輸入資料量較大條數較多的場景:根據集群
總體資源情況,以及分配給當前租戶的資源情況,在不影響其他業務正常執行的條件下,
map 數量需要適當增大,增加並行處理的力度。
(11)合理控制 reduce 的數量
reduce 數量會影響 mapreduce 過濾、聚合、對資料排序的效率。
對於關聯、聚合、排序時 reduce 端待處理資料量較大的場景:首先根據每個 reduce 處理的合適資料量控制 reduce 的個數,如果每個 reduce 處理資料仍然很慢,再考慮設
置引數增大 reduce 個數。另一方面,控制能啟動的 reduce 最大個數為分配給當前租戶的資源上限,以免影響其他業務的正常執行。
(12)將重複的子查詢結果儲存到中間表
對於指標計算型別的業務場景,多個指標的 hql 語句中可能存在相同的子查詢,為避免重複計算浪費計算資源,考慮將重複的子查詢的計算結果儲存到中間表,實現計算一次、結果共享的優化目標.....
hive效能調優
原文 limit 限制調整 因為使用 limit 語句時候,是先執行整個查詢語句,然後再返回部分結果的 set hive.limit.optimize.enable true set hive.limit.row.max.size 10000 set hive.limit.optimize.limi...
Hive效能調優
軟體環境 hive1.2.1 hadoop2.6.4 直接使用hive cli模式執行 1.設定執行引擎 set hive.execution.engine mr set hive.execution.engine spark 如果設定執行引擎為mr,那麼就會呼叫hadoop的maprecude來執...
Hive引數調優
一 map 階段的優化 1.map數的計算公式為 num map tasks max min mapred.min.spilt.size 指的是資料的最小分割單元大小 預設為1b mapred.max.split.size 指的是資料的最大分割單元大小 預設為 256mb dfs.block.siz...