2013-08-08 3 views
1

메모리 (1M 이상)에 비해 너무 큰 두 개의 데이터 세트를 비교하는 효과적인 방법을 찾고 있습니다. 둘 다 MySQL 테이블에 있습니다. 나는 서버와 클라이언트 사이의 차이점을 찾고 무엇을 업데이트하고, 만들고, 클라이언트에서 삭제하려고하는지 찾으려고 노력 중이다. 이전에 데이터를 정렬하거나 정렬 된 상태로 유지할 수 있습니다.빅 데이터 세트 비교

input: 
server = [ 
    {:id => 7, :rev => 1, :uuid => 111}, 
    {:id => 8, :rev => 3, :uuid => 222}, 
    {:id => 9, :rev => 1, :uuid => 333}, 
    ] 

client = [ 
    {:id => 8, :rev => 2, :uuid => 222}, 
    {:id => 9, :rev => 1, :uuid => 333}, 
    {:id => 6, :rev => 1, :uuid => 444}, 
    ] 

expected output: 
create: [{:id => 7, :rev => 1, :uuid => 111}] 
update: [{:id => 8, :rev => 3, :uuid => 222}] 
delete: [{:id => 6, :rev => 1, :uuid => 444}] 

이 diff 문제를 나누고 여러 근로자/노드를 통해 배포하는 방법을 찾고 있습니다. 다른 데이터 저장소를 사용할 수 있으며 루비 또는 C가 아닌 데이터 저장소에서 수행 할 수 있다면 좋을 것입니다. 제안?

답변

0

데이터 키 해시를 생성하고 이에 따라 작업을 배포 할 수 있습니다. 전의. "id mod 2"라는 간단한 해시 함수를 가정합니다. 그래서 모든 짝수 아이디는 하나의 머신에 의해 처리되고 모든 홀수 아이디는 두 번째 머신에 의해 처리됩니다.

각 개별 시스템에서 데이터는 정렬 된 순서 여야합니다.

0

은 당신이 정말로 배포 할 경우 Hadoop과 같은 MapReduce 프레임 워크를 사용해야합니다.

클라이언트와 서버에서 모두 map 인 모든 레코드를 id 인 키와 모든 레코드가 들어온 키와 값이 들어있는 값으로 보내는 것이 좋습니다.

그러면 reduce은 단일 id에 대한 레코드 만 처리하면되므로 직접적인 논리가됩니다.

프레임 워크, 방법, 기계 고장을 처리하는 작업을 배포 돌봐 등 만 100 만 개 기록을 각이있는 경우, 그냥 로컬 순서에 넣어 전체 원격 설정을 빨아 말했다

순서대로, 그리고 그들을 평행하게 걷는다. 그것은 충분히 빨리 실행될 가능성이 높으며, 원격 프레임 워크를 설정/사용하는 데 많은 어려움을 겪을 수 있습니다.