时结果 hive_Hive优化
優化思路:
hive性能優化時,把HiveQL當做M/R程序來讀,即從M/R的運行角度來考慮優化性能,從更底層思考如何優化運算性能,而不僅僅局限于邏輯代碼的替換層面。
列裁剪
Hive 在讀數據的時候,可以只讀取查詢中所需要用到的列,而忽略其它列
分區裁剪
可以在查詢的過程中減少不必要的分區,不用掃描全表。
合理設置reduce的數量
reduce個數的設定極大影響任務執行效率,在設置reduce個數的時候需要考慮這兩個原則:使大數據量利用合適的reduce數;使單個reduce任務處理合適的數據量。
在不指定reduce個數的情況下,Hive會猜測確定一個reduce個數,基于以下兩個設定:
參數1:hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的數據量,在Hive 0.14.0及更高版本中默認為256M)
參數2:hive.exec.reducers.max(每個任務最大的reduce數,在Hive 0.14.0及更高版本中默認為1009)
計算reducer數的公式: N = min( 參數2,總輸入數據量 / 參數1 )
job并行運行設置
帶有子查詢的hql,如果子查詢間沒有依賴關系,可以開啟任務并行,設置任務并行最大線程數。
hive.exec.parallel (默認是false, true:開啟并行運行)
hive.exec.parallel.thread.number (最多可以并行執行多少個作業, 默認是 8)
小文件的問題優化
如果小文件多,在map輸入時,一個小文件產生一個map任務,這樣會產生多個map任務;啟動和初始化多個map會消耗時間和資源,所以hive默認是將小文件合并成大文件。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; (默認)
如果map輸出的小文件過多,hive 默認是開啟map 輸出合并。
set hive.merge.mapfiles=true (默認是 true)
hive.merge.size.per.task(合并文件的大小,默認 256M)
hive.merge.smallfiles.avgsize(文件的平均大小小于該值時,會啟動一個MR任務執行merge,默認16M )
如果reduce輸出的小文件過多,hive需要手動設置開啟reduce輸出合并。
set hive.merge.mapredfiles=true (默認是 false)
hive.merge.size.per.task(合并文件的大小,默認 256M)
hive.merge.smallfiles.avgsize(文件的平均大小小于該值時,會啟動一個MR任務執行merge,默認16M )
join 操作優化
join 原則:
1)小表放左;
2)多表join,如果join字段一樣,只生成一個job 任務;
3)Join 的字段類型要一致。
MAP JOIN操作
如果你有一張表非常非常小,而另一張關聯的表非常非常大的時候,你可以使用mapjoin此Join 操作在 Map 階段完成,不再需要Reduce,hive默認開啟mapjoin。
hive的數據傾斜優化
數據傾斜的原因
key分布不均勻
業務數據本身的特性
某些SQL語句本身就有數據傾斜
數據傾斜的表現
任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的數據量和其他reduce差異過大。
單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大于平均時長。
通用解決方案——參數調節
對于group by 產生傾斜的問題
set hive.map.aggr=true; (默認是 true)
開啟map端combiner,減少reduce 拉取的數據量。
set hive.groupby.skewindata=true; (默認是 false)
有數據傾斜的時候進行負載均衡,當選項設定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分布到 Reduce 中(這個過程可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。
如果開啟負載均衡:
set hive.groupby.skewindata=true
SQL 語句調節:
大表Join大表:
非法數據太多,比如null。
假如null值沒有用處的話,可以將null值先過濾掉,再進行 union
把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由于null值關聯不上,處理后并不影響最終結果。
count distinct 數據傾斜
在執行下面的SQL時,即使設置了reduce個數也沒用,它會忽略設置的reduce個數,而強制使用1。這唯一的Reduce Task需要Shuffle大量的數據,并且進行排序聚合等處理,這使得它成為整個作業的IO和運算瓶頸。
設置多個reduce時,在reduce階段可以多個reduce處理數據,而不是只有一個reduce處理數據。
總結
以上是生活随笔為你收集整理的时结果 hive_Hive优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随机发牌_用Python制作4人扑克牌发
- 下一篇: 批量打印pdf并合并_CAD批量打印攻略