2016-06-13 3 views
2

나는 카산드라에 3 개의 테이블을 몇 개의 노드로 묶어 놓고 각각의 테이블 위에 앉아있다. 테이블 A, B, C를 호출 할 수 있습니다.카산드라 스파크 Datastax 복제본

A와 B는 큽니다 만 동일한 파티션 키를 가지고 있기 때문에 데이터를 결합 할 때 데이터 지역이 유지됩니다.

이제 다른 파티션 키가 있지만 다른 두 테이블만큼 큰 것은 아닌 다른 테이블 C에 가입하려고합니다. 또한해야한다면 테이블을 모든 노드에 복제 할 준비가되었습니다.

최소 셔플을 사용하여 데이터 지역성을 유지하면서 함께 가입하는 방법은 무엇입니까?

답변

1

언급했듯이 세 번째 테이블에는 다른 테이블과 같은 파티션 키가 없으므로 모든 데이터가 동일한 노드에 있는지 확인할 수 없습니다.

두 가지 옵션이 있습니다. 세 번째 RDD에서 sparkContext.broadcast을 사용하여 다른 RDD에서 map side join을 수행 할 수 있습니다. 브로드 캐스트 된 RDD가 클러스터의 모든 컴퓨터에서 "복제"되기 때문에이 옵션을 사용하면 셔플이 트리거되지 않습니다. 확인해야 할 것은 거대한 RDD를 브로드 캐스트하지 않는 것입니다 (거대한 의미에서 몇 기가 바이트를 의미합니다. 나는이 옵션을 사용하면보다 유연하게 할 수 있습니다, 방송 등 RDD 년대 악한 증거)

다른 옵션은 HashPartitioner on a parent RDD을 사용하고 발견 결코 당신이 점화 API에서 rightOuterJoin 또는 leftOuterJoin를 사용할 수 있기 때문에지도 양면 조인 . 그러나 모든 RDD를 상위 RDD로 매핑해야하며, 일반적으로 조인 작업에서 최상의 성능을 얻으려면 몇 개의 파티션을 사용해야하는지 알고 있어야합니다. 내 경험에 따르면 보통 파티션 당 약 128MB를 유지하지만 그 이상은 없습니다. 모든 것이 유스 케이스에 달려 있기 때문에 스스로 테스트하는 것보다 효율적입니다.

+0

감사합니다. 데이터가 그렇게 크지 않기 때문에 방송에 참여하기로했습니다. 나는 당신의 대답을 upvote 15 담당자가 없어, 미안 해요. – daviddecoding

관련 문제