Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Hadoop/Pig] pig의 join 종류 Computer & Program

Apache Pig를 통해서 join하는 방법에는 몇 가지가 있다. 왜 그런고 하니, hadoop은 디스크를 많이 사용하는 대용량 작업이 많다. 특히 join과 같이 많은 데이터를 읽고 쓰는 경우라면 MR을 돌릴 때 데이터를 어떻게 옮기느냐에 따라서 수행시간에 많은 차이가 있을 수 있다. 때문에 이런 join 방법들이 생겨난듯..

In-Stream Big Data Processing - Highly Scalable Blog에도 MR에서는 partitioning과 shuffling이 중요하다고 얘기하면서 간단하게 Disjoint data partitioning과 Divide and broadcast join에 대해 설명하고 있다. 간략하게 정리하면 join하는 데이터 중 하나가 극히 작은 사이즈이면 Divide and broadcast join이 유리할 수 있다는 것이다. 이는 pig의 Replicated Joins와 유사하다.



우선 join 방법들과는 별도로 더 좋은 성능을 낼 수 있는 경우가 정리돼 있다.
1. 데이터가 메모리에 올릴 수 있을 정도로 충분히 작다면 Replicated Join 성능이 월등히 좋다.
2. join의 왼쪽 테이블(relation)이 균등하게 분할되어 있는 경우 일반적으로 더 좋은 성능을 보였다.



Replicated Joins

join을 수행하는 relation 중 하나 이상이 상당히 작은 크기일 때 사용하면 좋다. 이 Replicated Joins는 작은 테이블을 모두 메모리에 올려서 계산하도록 유도되기 때문에 메모리에 모두 올리지 못 하면 프로세스가 실패하거나 에러를 뱉을 수 있다. 문서에 있는 내용에 따르면, 1GB 메모리에 10억개 사이즈(tuple?)의 relation 까지는 가능했다고 한다.

big = LOAD 'big_data' AS (b1,b2,b3);
tiny = LOAD 'tiny_data' AS (t1,t2,t3);
mini = LOAD 'mini_data' AS (m1,m2,m3);

C = JOIN big BY b1, tiny BY t1, mini BY m1 USING 'replicated';

inner join, outer join 모두 사용가능하다.



Skewed Joins

말 그대로 치우친(skewed) 데이터에 대해서 join하는 경우에 사용된다. 데이터가 치우쳐져 있으면 partitioning할 때 데이터가 고르게 분포되지 않아 병렬처리가 무생해진다. 여러 병렬작업 중 하나만 유난히 큰 데이터를 처리한다면, 그것이 끝날 때 까지 다른 작업은 대기해야 하기 때문이다.

이 경우 skewed join은 join key space의 분포를 파악해서 데이터가 잘 나눠질 수 있도록 유도한다. join 왼쪽 relation이 분포에 따라 분할되고 오른쪽 relation은 스트리밈으로 처리된다고 한다.

big = LOAD 'big_data' AS (b1,b2,b3);
massive = LOAD 'massive_data' AS (m1,m2,m3);

C = JOIN big BY b1, massive BY m1 USING 'skewed';

inner join, outer join 모두 사용가능하다. 현재는 2개 relation join에서만 사용 가능하다.



Merge Joins

간혹 join key에 대해서 모두 정렬되어 있는 데이터를 join해야 하는 경우가 있다. 이런 경우는 MR의 map단계만으로 join이 가능하기 때문에 상당히 빠른 응답을 받을 수 있다. (단, join의 결과는 정렬된 상태가 아니다.)

C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge';

그런데 join할 데이터는 Load 또는 Order 구문으로 받아져야 하는 등 데이터 loader에 대해 상당히 까다로운 조건을 가지고 있다. 자세한 조건은 문서를 참조하고, inner join의 경우는 PigStorage가 이 조건을 모두 구현해뒀기 때문에 PigStorage를 사용하면 좋다. outer join에서는 만들어져 있는 loader가 없기 때문에 직접 만들어서 사용해야 한다.



Merge-Sparse Joins

희박 행렬처럼 데이터가 거의 들어 있지 않은 relation join에 특화된 join이다. 1% 이하로 데이터가 들어 있을 때 좋은 성능이 나왔다고 한다.

a = load 'sorted_input1' using org.apache.pig.piggybank.storage.IndexedStorage('\t', '0');
b = load 'sorted_input2' using org.apache.pig.piggybank.storage.IndexedStorage('\t', '0');
c = join a by $0, b by $0 using 'merge-sparse';
store c into 'results';

inner join에서만 사용 가능하며, Merge Joins와 같은 제약조건을 가지고 있다.



- 참고
JOIN (inner) - Pig Latin Basics
Specialized Joins - Pig Performance and Efficiency
In-Stream Big Data Processing - Highly Scalable Blog

덧글

댓글 입력 영역

Google AdSense (text/image)