2013-09-25 7 views
0

존재하는 HashSet을 사용하고 싶습니다./매핑되는 동안 한 파일에 대해 작동하고 다음 파일이 매핑 될 때 다시 설정/다시 작성됩니다. isSplitable을 재정 의하여 TextInputFormat을 수정하여 false를 반환하므로 파일이 분할되지 않고 전체적으로 Mappers에서 처리됩니다. 이런 식으로 할 수 있습니까? 아니면 Accumulo 테이블에 기록하는 횟수를 줄이는 다른 방법이 있습니까?맵 전용 맵핑 작업에 의해 맵핑되는 동안 오브젝트의 인스턴스를 하나의 파일과 연관시킬 수 있습니까?

내가 먼저 글로벌 변수를 원한다고 생각하지 않는다. 유일성을 보장하고 Accumulo 테이블에 적은 돌연변이를 쓰고 싶습니다.

내 프로젝트는 선형 누적 클라이언트 프로그램의 샤드 예제에서 Index.java 파일의 기능을 Accumulo에서 동일한 테이블을 생성하면서 mapreduce 기능을 사용하는 프로그램으로 변환하는 것입니다. 그것은 화두가되기 때문에 mapreduce가되어야하며, 본질적으로 테라 바이트의 데이터에 대한 선형 프로그램보다 빠르게 실행됩니다. http://grepcode.com/file/repo1.maven.org/maven2/org.apache.accumulo/examples-simple/1.4.0/org/apache/accumulo/examples/simple/shard/Index.java

이 프로그램은 Accumulo에 돌연변이를 작성하는 BatchWriter를 사용하고 파일별로을 수행합니다 여기

참조에 대한 색인 코드입니다. 필요한 것보다 많은 돌연변이를 작성하고 유일성을 보장하기 위해 (비록 Accumulo가 결국 압축을 통해 동일한 키를 병합한다고 생각하지만) Index.java는 단어가 이전에 실행되었는지 확인하는 데 사용되는 HashSet을 가지고 있습니다. 이것은 모두 비교적 이해하기 쉽습니다.

지도 전용 mapreduce 작업으로 이동하는 것은 더 복잡합니다.

이 좀 나는 Accumulo 테이블을 본 적이 부분 출력에서 ​​작동하는 것 같다 매핑에서 내 시도했지만, 선형 프로그램에 비해 정말 정말 느린 실행 Index.java

public static class MapClass extends Mapper<LongWritable,Text,Text,Mutation> { 
     private HashSet<String> tokensSeen = new HashSet<String>(); 
     @Override 
     public void map(LongWritable key, Text value, Context output) throws IOException { 
      FileSplit fileSplit = (FileSplit)output.getInputSplit(); 
      System.out.println("FilePath " + fileSplit.getPath().toString()); 
      String filePath = fileSplit.getPath().toString(); 
      filePath = filePath.replace("unprocessed", "processed"); 

      String[] words = value.toString().split("\\W+"); 

      for (String word : words) { 
       Mutation mutation = new Mutation(genPartition(filePath.hashCode() % 10)); 
       word = word.toLowerCase(); 
       if(!tokensSeen.contains(word)) { 
        tokensSeen.add(word); 
        mutation.put(new Text(word), new Text(filePath), new Value(new byte[0])); 
       } 

       try { 
        output.write(null, mutation); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

그리고 느린 문제는 ZooKeeper 및 Accumulo가 설치된 Hadoop의 단일 노드 인스턴스 인 테스트 인스턴스에서이 모든 것을 실행한다는 것입니다. 그렇다면 독창성을위한 솔루션을 찾아야합니다.

제공된 도움이나 조언을 크게 듣습니다.

답변

1

매퍼는이 유형의 것을보다 명확하게 처리하기 위해 재정의 할 수있는 setupcleanup 메쏘드를 가지고 있습니다. setup이 한 번 호출되면 map이 여러 번 호출됩니다 (모든 레코드에 대해 한 번). cleanup이 한 번만 호출됩니다. 생각은 setup 메서드에서 HashSet을 만들고 map에 빌드하고 cleanup에 모든 내용을 커밋하거나 필요하면 map에 대한 호출을 주기적으로 플러시하는 것입니다.

그러나 실제 클러스터로 이동할 때까지 런타임에서 개선 된 부분은 거의 볼 수 없습니다. 단일 노드 테스트 인스턴스는 단순한 선형 프로그램에 비해 거의 이점이 없습니다. 단, 실제 hadoop 클러스터를 얻으면 동일한 코드가 훨씬 빠르게 실행됩니다.