Hive ERROR: Out of memory due to hash maps used in map-side aggregation

15580 단어
하이브가 빅데이터 양의 통계 조회 문장을 실행할 때 아래 OOM 오류가 자주 발생합니다. 구체적인 오류는 다음과 같습니다.
Possible error: Out of memory due to hash maps used in map-side aggregation.

Solution: Currently hive.map.aggr.hash.percentmemory is set to 0.5. Try setting it to a lower value. i.e 'set hive.map.aggr.hash.percentmemory = 0.25;'

task 보기 실패 정보:
Error:GC overhead limit exceeded

이 오류는 일반적으로 두 가지 상황으로 인해 발생한다. (1)hivesql이 불합리하게 써서 실행할 때hashmap이 너무 크다.(2)hivesql는 최적화의 여지가 없다.
(1)에 대해서는 sql 문장을 바꾸어hashmap의 크기를 낮춘다.(2)의 경우 매개변수를 조정할 수 있습니다.
다음은 (1) 및 (2) 상황에 대한 설명입니다.
(1) sql 문장 바꾸기
select count(distinct v) from tbl;
 select count(1) from (select v from tbl group by v) t;

설명:hashmap의 키 개수 감소
select collect_set(messageDate)[0],count(*) from incidents_hive group by substr(messageDate,8,2);
 select hourNum, count(1) from (select substr(messageDate,9,2) as hourNum from incidents_hive ) t group by hourNum;

설명:hashmap의 키 개수를 줄이지 않았지만value의 크기를 줄였습니다
(2) 매개변수 조정
이 sql 문장은 최적화할 수 없습니다. (keywords의 중복률이 낮기 때문에 맵 단계에서 유지되는 메모리 맵 대상이 매우 크기 때문) 해시맵의 크기를 낮출 수 있습니다.
INSERT OVERWRITE TABLE hbase_table_poi_keywords_count SELECT concat(substr(key,0,8), svccode, keywords), substr(key,0,8), svccode, keywords, count(*) where substr(key,0,8)=\"$yesterday\" AND length(keywords)>0 AND svccode is not null GROUP BY substr(key,0,8),svccode,keywords;

mapjoin과 map aggregate와 관련된 최적화 매개 변수는 다음과 같습니다.
hive.map.aggr
hive.groupby.mapaggr.checkinterval
hive.map.aggr.hash.min.reduction
hive.map.aggr.hash.percentmemory
hive.groupby.skewindata
위의 매개 변수는 구성 파일 설명인 문서를 보고 조정할 수 있습니다.만약 수요가 이 매개 변수를 조정해서 도달할 수 없다면, set hive.map.aggr=false가 최종 방안입니다. 이것은 틀림없이 당신의 요구를 만족시킬 수 있습니다. 단지 실행 속도가 맵join과mapaggr보다 느릴 뿐입니다. 그러나 실제 데이터를 통해 당신은 사실 그것도 느리지 않다는 것을 발견할 수 있습니다.
참고 자료:
http://blog.csdn.net/macyang/article/details/9260777 http://www.myexception.cn/open-source/1487747.html http://blog.csdn.net/lixucpf/article/details/20458617
INSERT OVERWRITE TABLE hbase_table_poi_keywords_count SELECT concat(substr(key,0,8), svccode, keywords), substr(key,0,8), svccode, keywords, count(*) where substr(key,0,8)=\"$yesterday\" AND length(keywords)>0 AND svccode is not null GROUP BY substr(key,0,8),svccode,keywords;

좋은 웹페이지 즐겨찾기