2013-07-18 2 views
3

중복 된 내용이 포함 된 많은 양의 장치 데이터가 있습니다. 또한 수집 된 메타 데이터의 기록 목록 (가져온 파일을 고유하게 식별하기 위해)을 별도로 제공합니다. 내 섭취 한 기기 데이터를 기록으로 중복 제거하려고합니다. 이 기록 파일은 작지 않으므로 메모리에로드하는 것을보고 있지 않습니다. Reduce side join도 고려해 봤지만 엄청난 양의 데이터를 네트워크를 통해 전달할 것입니다.하둡의 중복 제거

Bloom 필터는 내 기록 파일의 크기를 줄이기 위해보고있는 것입니다. 그러나 그것은 나에게 반대를 제공하고 있습니다. 그렇지 않으면 내가 복제본을 가지고 있다고보고 할 수 있습니다.

중복 제거는 상당히 일반적인 문제인 것처럼 보이며 다른 누구에게도 가능한 아이디어가 있는지 살펴보고자합니다.

답변

4

중복 제거를 위해 Map/Reduce를 사용하고 작업에 여러 대의 컴퓨터를 사용하려는 경우 이 있으면 네트워크를 통해 모든 데이터를 전송할 수 있습니다. 이것이 하둡이하는 일입니다!

물론 한 대의 컴퓨터에서 모든 것을 실행할 수도 있습니다. 시간이 오래 걸릴 것입니다. 핵심에서 중복 제거는 Hadoop이 자연스럽게 수행하는 기능 중 하나이며 대부분의 기능을 무료로 사용할 수 있습니다. Hadoop은 Map 단계에서 모든 "키"를 해시하고 "키"에 속한 모든 "값"이 같은 감속기.

작업 자체는 매우 간단합니다. 실제로는 가장 간단한 Map/Reduce 작업 중 하나 인 WordCount 예제와 거의 같습니다. 카운트 출력을 건너 뛰고 키만 출력하십시오 (값으로 NullWritable 사용). 아래에지도를 포함하고 기능을 축소했습니다. 참고 : 리 듀서에 N 개의 여러 기계를 사용하는 경우 하나의 파일을 되 찾으려면 각 감속기의 결과 N 출력 파일을 연결해야합니다. 여기 코드는 다음과 같습니다

public void map(LongWritable key, Text value, Context context) 
    throws IOException, InterruptedException { 
    String line = value.toString(); //process your data here 
    context.write(line, NullWritable.get()); 
} 


public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    throws IOException, InterruptedException { 
    context.write(key, NullWritable.get()); 
} 

편집 1 : 다른 대답에 의해 제안 결합기를 사용하려는 경우, 당신은 그렇게 쉽게 할 수 있습니다. 데이터가 네트워크를 통해 전송되기 전에 결합기가 실행되므로 로컬 Reducer로 간주 할 수 있습니다. 그냥 설정

job.setCombinerClass(Reduce.class); 

여기서 Reduce는 reduce() 메소드가 포함 된 클래스입니다.


편집 2 : 당신은 단지 다루는 문자열을 가지고 전혀 처리를 할 필요가없는 경우 value.toString()이 불필요하고 필요한되지 않습니다 : 내가받은 제안에 따라 경찰. 그런 다음 Mapper를 조금 단순화 수 :

public void map(LongWritable key, Text value, Context context) 
    throws IOException, InterruptedException { 
    context.write(value, NullWritable.get()); 
} 
1

Combiner이 충분히 많은 중복을 많이 가지고있는 경우 네트워크 트래픽을 줄일 수있는 하나의 좋은 방법입니다 잊지 마세요 클러스터의 단일 호스트가 이미 것 많은 중복이있다.