2010-06-06 3 views
6

큰 데이터 세트를 통과하는 알고리즘을 사용하면 일부 텍스트 파일을 읽고 해당 행의 특정 검색어를 검색 할 수 있습니다. 나는 자바로 구현했지만 코드를 게시하고 싶지 않아서 나를 위해 그것을 구현할 누군가를 찾고있다.하지만 정말 도움이 많이 필요하다. 이것은 내 프로젝트를 위해 계획된 것이 아니었지만 데이터 세트는 거대하기 때문에 선생님이 내가 이렇게해야한다고 말했습니다.지도로이 알고리즘을 구현하는 데 도움이 필요합니다. Hadoop MapReduce

편집 내가 가진 데이터 세트가 하둡 클러스터에 (내가 버전을 previos 명확히하지 않았다), 그리고 내가 맵리 듀스에 대해 읽고 있던 그 맵리 듀스 구현

을하고 내가 먼저 할 것을 thaught한다 표준 구현을 사용하면 mapreduce를 사용하는 것이 더 쉽습니다. 그러나 알고리즘은 꽤 어리 석고 특별한 것이 없기 때문에 일어날 일이 없으며지도를 줄이면 ... 내 마음을 감쌀 수 없습니다. 당신이 볼 수 그래서 여기

는,

LIST termList (there is method that creates this list from lucene index) 
FOLDER topFolder 

INPUT topFolder 
IF it is folder and not empty 
    list files (there are 30 sub folders inside) 
    FOR EACH sub folder 
     GET file "CheckedFile.txt" 
     analyze(CheckedFile) 
    ENDFOR 
END IF 


Method ANALYZE(CheckedFile) 

read CheckedFile 
WHILE CheckedFile has next line 
    GET line 
    FOR(loops through termList) 
      GET third word from line 
      IF third word = term from list 
     append whole line to string buffer 
    ENDIF 
ENDFOR 
END WHILE 
OUTPUT string buffer to file 

또한 내 알고리즘의 의사 코드 곧 "분석"을 만들 수, 새로운라는 파일이 있습니다 때마다, 나는 그지도가 감소 이해 어렵다 많은 출력에 쓰는가 ???

mapreduce의 직감을 이해하고 제 예제가 mapreduce에 완벽하게 적합하다고 생각합니다.하지만이 작업을 수행 할 때 분명히 충분히 알지 못하고 STAKK입니다!

제발 도와주세요.

답변

3

빈 감속기를 사용하고 파일마다 단일 매퍼를 실행하도록 작업을 분할 할 수 있습니다. 각 매퍼는 출력 폴더에 자체 출력 파일을 만듭니다.

+0

안녕하세요! 대답은 고맙습니다 !!! 그러나 나는 내가 이해할 수 있는지 잘 모르겠다 :/당신은 나에게 좀 더 많은 정보를 줄 수 있니? 당신은 아마 그와 같은 몇 가지 예가 있습니까 ??? – Julia

2

지도 Reduce는 멋진 Java 6 동시성 기능, 특히 Future, Callable 및 ExecutorService를 사용하여 쉽게 구현됩니다.

는 당신이 우리가 찾은 각 파일의 새 호출을 작성하고 실행 프로그램 서비스에이를 제출해야
public class FileAnalyser implements Callable<String> { 

    private Scanner scanner; 
    private List<String> termList; 

    public FileAnalyser(String filename, List<String> termList) throws FileNotFoundException { 
    this.termList = termList; 
    scanner = new Scanner(new File(filename)); 
    } 

    @Override 
    public String call() throws Exception { 
    StringBuilder buffer = new StringBuilder(); 
    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     String[] tokens = line.split(" "); 
     if ((tokens.length >= 3) && (inTermList(tokens[2]))) 
     buffer.append(line); 
    } 
    return buffer.toString(); 
    } 

    private boolean inTermList(String term) { 
    return termList.contains(term); 
    } 
} 

을 지정한 방법으로 파일을 분석하는 호출 가능을 만들었습니다. 제출 된 결과는 나중에 우리가 파일 구문 분석 결과를 얻기 위해 사용할 수있는 미래입니다.

public class Analayser { 

    private static final int THREAD_COUNT = 10; 

    public static void main(String[] args) { 

    //All callables will be submitted to this executor service 
    //Play around with THREAD_COUNT for optimum performance 
    ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); 

    //Store all futures in this list so we can refer to them easily 
    List<Future<String>> futureList = new ArrayList<Future<String>>(); 

    //Some random term list, I don't know what you're using. 
    List<String> termList = new ArrayList<String>(); 
    termList.add("terma"); 
    termList.add("termb"); 

    //For each file you find, create a new FileAnalyser callable and submit 
    //this to the executor service. Add the future to the list 
    //so we can check back on the result later 
    for each filename in all files { 
     try { 
     Callable<String> worker = new FileAnalyser(filename, termList); 
     Future<String> future = executor.submit(worker); 
     futureList.add(future); 
     } 
     catch (FileNotFoundException fnfe) { 
     //If the file doesn't exist at this point we can probably ignore, 
     //but I'll leave that for you to decide. 
     System.err.println("Unable to create future for " + filename); 
     fnfe.printStackTrace(System.err); 
     } 
    } 

    //You may want to wait at this point, until all threads have finished 
    //You could maybe loop through each future until allDone() holds true 
    //for each of them. 

    //Loop over all finished futures and do something with the result 
    //from each 
    for (Future<String> current : futureList) { 
     String result = current.get(); 
     //Do something with the result from this future 
    } 
    } 
} 

여기에 나와있는 예제는 완벽하지 않으며 효율적이지 않습니다. 당신이 완료 요소를 제거는 futureList을 통해 루핑 유지할 수 정말 큰 있다면 나는, 비슷한 표본의 크기를 고려하지 않은 : 당신은 생산자 - 소비자 유형 설정을 구현할 수 또는

while (futureList.size() > 0) { 
     for (Future<String> current : futureList) { 
     if (current.isDone()) { 
      String result = current.get(); 
      //Do something with result 
      futureList.remove(current); 
      break; //We have modified the list during iteration, best break out of for-loop 
     } 
     } 
} 

을 어디에 생산자는 유언 집행자 서비스에 호출 가능 물을 제출하고 미래를 생산하며 소비자는 미래의 결과를 가져 와서 미래를 폐기합니다.

이것은 생산자와 소비자가 스레드 자체 일 수 있고 선물 추가/제거를위한 동기화 목록이 필요할 수 있습니다.

질문이 있으시면 언제든지 문의하십시오.

+0

안녕하세요. 제안 된 솔루션을 주셔서 대단히 감사합니다 !!나는 분명히 문제를 분명히하지 못해서 미안하다. 저의 실수는 방금 제목에서 Hadoop을 언급했지만 데이터 세트가 hadoop을 실행하는 클러스터에 있기 때문에 Hadoop MaPreduce 프레임 워크에 따라 구현해야합니다 ... 지금 내 게시물을 편집합니다. 분석중인 데이터 세트는 6GB입니다 :/너무 많은 동시성에 대처하기 위해 그것 ?????? – Julia

+0

죄송합니다. 저는 여기 멍청합니다. D 약간 구속하기 위해 코드를 100 ~ 61MB, 총 6GB까지 사용했습니다. 나는 당신의 파일 파서가 무엇을하는지 잘 모르겠다. 그래서 세부 사항을 빠뜨리고 각 줄을 스캔하고 빈 문자열을 반환했다. 내가 생각했던 약간의 부작용. 성능이 너무 좋지 않아서 스레드 풀 크기가 100이므로 100 개의 파일 모두가 실행 프로그램 서비스에 의해 대기열에 저장되지 않고 구문 분석되었습니다. 총 작동 시간은 Atom 프로세서에서 17 분이었습니다. 죄송합니다. 귀하의 질문에 올바르게 답변하지 못했습니다. 저는 Hadoop에 대한 경험이 없지만 SquareCog의 대답을 읽은 후에 말이됩니다. –

+0

안녕하세요! 대단히 고마워, 너는 많이 도와 줬어. 왜냐하면 내가 가진 두뇌와 시간을 가진 hadoop MR에 대처할 수 없기 때문이다. 내가 구현할 수있는 유사한 알고리즘이 몇 개 더있을 것입니다. 내가 할 수있는 방식으로 시도해야합니다. 어디에도 hadoop 도움말을 가져올 수 없습니다 :/ 그래서 코드를 채택했으며 인텔 2Ghz에서 스레드 풀 42는 결과를 파싱하여 새로운 파일로 출력하는 데 약 20 분이 걸렸지 만 200MB의 데이터 (42 개 파일)로만 출력되었습니다. 다시 말하지만, 나는 파서에 약간의 수정을해야한다. 좀 더 엄격한 매칭을해야한다. 순수한 "contains"라는 용어는 아니다. 그래서 나는 그것을 모두 실행할 때, 결과를 안다. – Julia