2010-01-24 4 views
2

한 파일에서 단어를 읽고 다른 파일에서 검색 할 수있는 hadoop 응용 프로그램을 만들고 싶습니다. 그것은 하나 개의 출력 파일 단어가 존재하지 않는 경우에 쓸 수있다 - - 또 다른 출력 파일다른 파일의 한 파일에서 단어를 검색하는 Hadoop

에 기록하는 내가 하둡에 몇 가지 예를 시도

단어가 존재하는 경우

. 두 가지 질문이 있습니다

두 파일의 크기는 각각 약 200MB입니다. 다른 파일의 모든 단어를 검사하면 메모리 부족 현상이 발생할 수 있습니다. 이 작업을 수행 할 대체 방법이 있습니까?

hadoop의 축소 단계 출력이 하나의 파일에만 있기 때문에 다른 파일에 데이터를 쓰는 방법. 다른 출력 파일에 데이터를 쓰기 위해 위상을 줄이기위한 필터를 사용할 수 있습니까?

감사합니다.

+0

안녕, 난 당신이 거의 같은 일을 implemet해야하지만, 나는이를 만들기 위해 관리 초보자를 하둡 정말 해달라고 :/제발 내 질문을보고 나에게 약간의 피드백을 줄 수 있니, 정말로 고투하고 도저히 도움이되지 않아./ http://stackoverflow.com/questions/2986271/need-help-implementing-this-algorithm -with-map-hadoop-mapreduce – Julia

답변

8

나는 그것을 할 것입니다 방법 :

  1. 분할 값 (* 1)
  2. 당신이 얻을 것이다 '감소'(< 단어>, < 소스>) 방출, 단어 '지도'에 (< 단어>, 소스 < 목록>)
  3. 체크 소스 목록, <
  4. 모든 소스가 목록에 있지 않은 경우, 모든 시간을 방출 (< missingsource> (/ 모든 소스 모두 긴 수 있습니다) 단어>)
  5. 작업 2 : job.setNumReduceTasks (< numberofsources>)
  6. 작업 2 :에 방출 (>,> < 단어를 < missingsource)을 '지도'
  7. 작업 2 : 널 (null) (모든 '감소'의 각 < missingsource>에 대한 방출, 당신은 각 문서에 대한 누락 된 단어를 포함, 다른 < missingsources로> - 출력을 감소 정도 될 겁니다

< 단어>). 파일을 표시하기 위해 'reduce'시작 부분에 < missingsource> ONCE를 쓸 수 있습니다.

(* 1) 하우투지도에서 소스 (0.20) 발견 :

private String localname; 
private Text outkey = new Text(); 
private Text outvalue = new Text(); 
... 
public void setup(Context context) throws InterruptedException, IOException { 
    super.setup(context); 

    localname = ((FileSplit)context.getInputSplit()).getPath().toString(); 
} 

public void map(Object key, Text value, Context context) 
    throws IOException, InterruptedException { 
... 
    outkey.set(...); 
    outvalue.set(localname); 
    context.write(outkey, outvalue); 
} 
+0

굉장해. 정말 고마워. – Boolean

0

내 의견으로는 두 단계로 수행하는 것이 좋습니다. 두 개의 초기 문서에 대해 wordcount 프로그램 (hadoop 예제 jar에 포함되어 있음)을 실행하면 각 문서에있는 단어의 고유 목록 (개수 포함)을 포함하는 두 개의 파일이 제공됩니다. 거기에서, 당신의 질문에 대답해야 할 두 파일에 대한 간단한 비교를 hadoop을 사용하는 것보다 수행합니다.

1

이 문제를 해결하기위한 특별한 이유로 Hadoop/MapReduce를 사용하고 있습니까? 이것은 Hadoop보다 Lucene 기반 응용 프로그램에 더 적합한 것으로 들립니다. 당신은 하둡을 사용하는 경우

나는 몇 가지 제안이 있습니다

  1. 귀하의 '문서'맵리 듀스가 처리 할 수있는 형식으로해야합니다. 가장 쉬운 형식은 문서의 각 단어가 한 줄에있는 CSV 기반 파일입니다. PDF 등을 사용하면 작동하지 않습니다.

  2. MapReduce가 처리하는 데이터와 비교할 MapReduce 작업의 입력으로 단어 집합을 가져 오려면 Distributed Cache을 사용하여 각 매퍼가 입력에서 찾고자하는 단어 집합을 작성할 수있게하십시오. 그러나 단어 목록이 크다면 (200MB 언급)이 방법이 효과가 있을지 의심 스럽습니다. 이 방법은 MapReduce에서 조인을 할 수있는 주요 방법 중 하나입니다.

여기 다른 대답에서 언급 한 색인 방법도 가능성을 제공합니다. 다시 말하지만, 문서 인덱싱이라는 용어는 내가 Lucene을 생각하게 만든다. 이 방법을 사용했다면 키 값에 단어뿐만 아니라 문서 식별자도 포함시켜 각 문서에 단어 수를 포함시켜야합니다.

MapReduce 작업에서 여러 개의 출력 파일을 생성 한 적이 없다고 생각합니다. 인덱싱 된 출력을 여러 파일로 처리하려면 코드를 작성해야하며 매우 간단해야합니다.