2015-01-12 5 views
6

하이브 쿼리를 실행하는 데 AWS-EMR을 사용하고 하이브 버전 0.13.1을 실행하는 동안 성능 문제가 있습니다.하이브 버전의 성능 문제 0.13.1

최신 버전의 하이브는 10 행의 데이터를 실행하는 데 약 5 분이 걸렸습니다. 그러나 230804 행에 대한 동일한 스크립트는 2 일이 소요되고 여전히 실행 중입니다. 문제를 분석하고 수정하려면 어떻게해야합니까?

샘플 데이터 :

표 1 : 표 1에 대한

hive> describe foo; 
OK 
orderno string 
Time taken: 0.101 seconds, Fetched: 1 row(s) 

샘플 데이터 :

hive>select * from foo;   
OK 
1826203307 
1826207803 
1826179498 
1826179657 

표 2

01 표 2 23,516,
hive> describe de_geo_ip_logs; 
OK 
id   bigint          
startorderno  bigint          
endorderno   bigint          
itemcode    int           
Time taken: 0.047 seconds, Fetched: 4 row(s) 

샘플 데이터 :

hive> select * from bar; 

127698025 417880320 417880575 306 
127698025 3038626048 3038626303 584 
127698025 3038626304 3038626431 269 
127698025 3038626560 3038626815 163 

내 쿼리 :

SELECT b.itemcode 
FROM foo a, bar b 
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno; 

Attached the hive logs for the above query.

+0

하이브 0.13은 이전 버전의 쿼리가이 버전에서 실행되지 않기 때문에 많은 문제가 있습니다. 최신 하이브 사용 0.14 –

+0

하이브 -0.14는 삽입, 업데이트, 삭제와 같은 많은 고급 기능을 가지고 있습니다. –

+0

이 질문은 터무니 없습니다. . – gobrewers14

답변

7

당신의 안녕의 맨에서 ve 로그 출력의 경우 "경고 : Shuffle Join JOIN [4] [Stage a 1 Mapred] 스테이지의 [Tables a, b] 스테이지가 교차 제품입니다."

EDIT : '교차 곱'또는 데카르트 곱은 'a'테이블의 모든 행에 대해 'b'테이블의 모든 행을 반환하는 조건없는 조인입니다. 따라서 'a'가 5 행이고 'b'가 10 행인 경우, 제품에 5를 곱한 값이 10 = 50 행으로 반환됩니다. 하나 또는 다른 테이블에 대해 'null'인 행이 많이있을 것입니다.

'20,000 개의 행이있는'a '테이블을 가지고 50 만 개의 다른 테이블'b '에 가입하면 SQL 엔진에 10000000000 개의 데이터 세트'a, b '를 반환하도록 요청할 것입니다 행을 작성한 다음 1 천만 행에 대해 BETWEEN 조작을 수행하십시오.

따라서 'b'행의 수를 줄이면 'a'보다 더 많은 이점을 얻을 수 있습니다. 예를 들어, ip_logs 테이블 (표 2)을 필터링 할 수 있다면, 주문 번호 테이블보다 많은 행이 있다고 가정하면 실행 시간이 단축됩니다. 끝 편집

조인 조건을 지정하지 않아서 실행 엔진이 카디 전 곱을 통해 작동하도록하고 있습니다. 그것은 모든 테이블을 계속해서 스캔해야합니다. 10 개의 행을 사용하면 문제가 발생하지 않습니다. 20k를 사용하면 수십 개의지도/축소 파도가 발생합니다.

이 쿼리보십시오 :

SELECT b.itemcode 
FROM foo a JOIN bar b on <SomeKey> 
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno; 

을하지만 난 당신의 모델에 합류 할 수 무슨 열을 알아내는 데 문제가 있어요. 어쩌면이 표현을위한 데이터 모델이 개선 될 수 있을까요? 샘플을 분명히 읽지 않을 수도 있습니다.

어느 쪽이든, where 절 이전에 비교 횟수를 필터링해야합니다. 하이브에서이 작업을 수행 한 다른 방법은 더 작은 데이터 집합으로 뷰를 만들고 원래 테이블 대신 뷰를 조인/일치시키는 것입니다.

+0

고맙습니다 @suiterdev. 나는 위의 쿼리를 ON으로 사용하고 있습니다. MAPJOIN [8] [bigTable = b] 작업 'Stage-3 : MAPRED'는 교차 제품입니다. 그러나 쿼리가 실행중인 큰 데이터 집합입니다. – brisk

+0

나는 더 나은 정보를 제공하기 위해 나의 대답을 편집했다. – suiterdev