2014-01-23 2 views
2

내 문제.하이브 IP 지오 코딩 (십자가 조인 큰 테이블)

나는 지오 코딩해야하는 고유 IP 주소가 500,000 개 있습니다. 지오 코드 조회 테이블에는 ip-from 및 ip-to 범위가 있습니다.이 범위는 180 만 행의 표와 비교해야합니다.

그래서 그것은 기본적으로이다 :

EMR, 나는 10 m1.large의 십자가 동안 클러스터를 실행하는거야 AWS에
select * 
/*+ MAPJOIN(a) */ 
from ip_address a 
cross join ip_lookup b 
where a.AddressInt >= b.ip_from and a.AddressInt <= b.ip_to; 

이 단계는 20 분 동안 0 %에 붙어 있지만, 여기에 재미있는 일이됩니다 가입 :

Stage-5: number of mappers: 1; number of reducers: 0 

질문 : 1) 중 하나가 크로스 조인보다 더 좋은 아이디어가? 나는 몇 가지 인스턴스를 더 발사하는데 신경 쓰지 않지만 도움이 될지 의심 스럽다. 2) 나는 메모리에서 ip_address를 저장하는 것처럼 십자가 조인을 실제로하고 있는가?

미리 감사드립니다.

답변

1

작년에 당신의 문제가있었습니다.

여기 RAM에 장착 내 지오 테이블 내가 무슨 짓을했는지 때문에

:

내가 작성한
  1. 자바 클래스는 RAM에 디스크에서 지리 정보를 읽고 그 (의이 GeoCoder를 호출하자)는 메모리에 지오 코딩 않았다 .
  2. geocode.info 파일을 분산 캐시에 추가했습니다 (하이브 add file 명령이이를 수행함).
  3. 나는 방법으로 GeoCoder 인스턴스를 생성했거나 이미 생성 된 경우 사용 된 UDF을 작성했습니다. Hive UDFgetClass().getClassLoader().getResource("geocode.info").getFile()
  4. 을 통해 분산 캐시에서 파일의 로컬 경로를 가져올 수 있습니다. 이제 로컬 경로가 geocode.info (이제는 일반 파일 임)이고 나머지는 기록입니다.

아마도이 방법은 과잉 공격 (150 라인의 Java)이지만 저에게 효과적 일 것입니다.

나는 당신이 정말로 당신의 작업을 위해 Hadoop을 사용할 필요가 있다고 가정한다. 500000 개의 IP를 지오 코딩하는 것은 노트북에서 매우 빠르게 수행 할 수 있습니다.