Hive:表1inner join表2结果group by优化
問題背景
最近遇到一個比較棘手的事情:hive sql優化:
lib表(id,h,soj,noj,sp,np) ? ? ? ? --一個字典表
mitem表(md,mt,soj,noj,sp,np)--一天的數據,包含小時分區的表。
業務:
1)需要先把lib表與mitem表進行關聯(關聯條件是lib.soj=mitem.soj and lib.noj=mitem.noj),關聯后的結果按照soj,md,mt,id,h進行分組;
2)對1)中的結果在分組的時候需要統計差值的平均值記為svalue;
3)對關聯后的分區的統計后的數據,進行一次分組排序:按照soj,md,mt分組,按照svalue排序,只保留同一個分組內排序第一的記錄。
其中表lib有3億條記錄,mitem表包含記錄數50~150億左右,lib與mitem關聯后的記錄數在6000億條記錄,之后對這個關聯后的結果進行進行分組卻執行了6小時后拋出異常問題。
嘗試解決方案
?瓶頸主要體現在在對第一次關聯后的記錄包含了6000億條記錄進行分組時,耗費資源,資源不足導致的問題。
嘗試過的解決方案:
1)創建索引:《hive:創建索引》
針對該6000億條記錄進行創建索引,耗費了20小時后依然是在stage2失敗了,此方案推翻。
2)對mitem數據按照小時粒度進行數據拆分,之后每一個小時的mitem與lib進行關聯,結果耗費時間為20多個小時,依然是拋出異常。
3)對mitem數據按照小時粒度進行分區,同時對lib表按照字段soj進行分頁(分10頁,一頁中包含的lib記錄數約3000w條)《hive:某張表進行分頁》
create table lib_soj as select soj?from lib group by soj;--記錄數約為8000條記錄
create table lib_soj_page as select row_number()over(order by soj)rnum,soj from lib_soj;
create table lib_1_1000 as select t10.* from lib t10 inner join?lib_soj_page t11 on t10.soj=t11.soj where t11.rnum between 1 and 1000;--記錄數約為3000w條記錄。
此時,拿一個小時的select * from?mitem where hour='2017102412' 與一個分頁中的soj進行關聯,數據終于出來了,可是耗費的時間為1小時20分,那么該總體時間為1.33*24*10小時。時間實際上太長了。
4)針對2)、3)的方案我們得知,如果把mitem查分帶來的效果實際上是不大,而查分lib的效果特別明顯,于是想到如果把lib查分的粒度更細與一天的mitem進行關聯是否可行(這里是查分為20份,一份數據約為1500w)。
測試結果,耗時3小時20分,那么總體的時間約為3.33*20小時。如果并行執行多個分頁的數據相信時間上會縮短。
?但是目前這個方案應該是shuffle時出現了數據偏移問題:
調優:
https://tech.meituan.com/spark-tuning-pro.html
提高shuffle并行度:
http://blog.csdn.net/u013939918/article/details/60956620
?
。
總結
以上是生活随笔為你收集整理的Hive:表1inner join表2结果group by优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LINQ Order by 排序
- 下一篇: 将一个大文件分成若干个小文件方法