2014-03-30 6 views
2

Hadoop Mapreduce를 사용하여 파일의 중복 제거를 구현하려고합니다. 필자는 매퍼 함수의 입력 디렉토리에있는 모든 파일의 MD5 합계를 계산하여이를 수행 할 계획입니다. 이러한 MD5 해시는 감속기의 열쇠가되므로 동일한 해시를 가진 파일은 동일한 감속기로 이동합니다.hadoop mapreduce를 사용한 중복 제거를위한 키 값 쌍 결정

Hadoop에서 매퍼의 기본값은 키가 줄 번호이고 값이 파일의 내용이라는 것입니다.

또한 파일이 크다면 64 메가 바이트 (Hadoop의 최대 블록 크기)의 덩어리로 분할됩니다.

내 매퍼에서 파일의 해시를 계산할 수 있도록 키 값을 파일 이름으로 설정하려면 어떻게해야합니까? 또한 두 노드가 동일한 파일에 대한 해시를 계산하지 않도록하는 방법은 무엇입니까?

+1

파일이 얼마나 큰 있습니다 ? 크기면에서 보면 ... 텍스트 파일입니까? –

+0

이 파일은 텍스트 파일로, 수십 KB에서 100 분의 1 MB 사이에있을 수 있습니다. – ManTor

+1

여기에 hadoop 코드의 일부가 아닌 WholeFileInputFormat을 사용할 수 있습니다. Hadoop : The Definitive Guide 서적을 통해 온라인으로 구현할 수 있습니다. 이렇게하면 전체 파일을 값으로 매핑 할 수 있습니다. 이 값에 대해 MD5를 수행하고 키로 내 보냅니다. 값은 파일 이름이 될 수 있습니다. Context 인스턴스에서 getInputSplit()을 호출하면 입력 분할이 파일 분할로 캐스팅 될 수 있습니다. 그런 다음 fileSplit.getPath(). getName()을 사용하면 파일 이름을 얻을 수 있습니다. 이렇게하면 값으로 방출 될 수있는 파일 이름이 생깁니다. –

답변

3

전체 파일을 한 매퍼의 입력으로 사용해야 할 경우 isSplitable을 false로 유지해야합니다. 이 시나리오에서는 매퍼에 대한 입력으로 전체 파일을 가져 와서 MD5를 적용한 다음 키로 내보낼 수 있습니다.

WholeFileInputFormat (여기서 hadoop 코드의 일부는 아닙니다)을 여기에서 사용할 수 있습니다. Hadoop : The Definitive Guide 서적을 통해 온라인으로 구현할 수 있습니다.

값은 파일 이름이 될 수 있습니다. Context 인스턴스에서 getInputSplit()을 호출하면 입력 분할이 파일 분할로 캐스팅 될 수 있습니다. 그러면 fileSplit.getPath().getName()이 파일 이름을 생성합니다. 그러면 값으로 방출 될 수있는 filename이 표시됩니다.

나는이 일을하지 않았습니다 - org.apache.hadoop.hdfs.util.MD5FileUtils,하지만 javadocs는 이것이 당신에게 도움이 될 것이라고 말합니다.

WholeFileInputFormat 및 관련 RecordReader에 대한

교과서 SRC 링크는 WholeFileRecordReader

또한 MD5FileUtils에 grepcode link 포함 참조

1) WholeFileInputFormat

2)에 포함 된