2011-10-22 2 views
4

hadoop에서 실행되는 응용 프로그램이 있습니다. 어떻게 데이터를 처리 할 수 ​​있도록 대상을 매퍼와 축소기에 전달할 수 있습니까? 예를 들어, Mappers에서 처리 된 행을 필터링하기위한 FieldFilter 객체를 선언합니다. 필터는 사용자가 지정한 많은 필터 규칙을 포함합니다. 그래서, 어떻게 필터와 규칙을 Mappers와 Reducers에 전달할 수 있을지 궁금합니다. 제 아이디어는 객체를 문자열로 직렬화하고, 문자열을 구성으로 전달한 다음 다시 문자열로 객체를 구성하는 것입니다. 그러나 나에게는 좋지 않은 것처럼 보인다! 다른 접근법? 덕분에 !Mapper 및 reducers에 객체를 전달하는 방법

public class FieldFilter {  
private final ArrayList<FieldFilterRule> rules = new ArrayList<FieldFilterRule>(); 

public FieldFilter addRule(FieldFilterRule ... rules) { 
    for (int i = 0; i < rules.length; i++) { 
     this.rules.add(rules[i]); 
     rules[i].setFieldFilter(this); 
    } 
    return this; 
} } 
+0

질문에 대한 답변을 수락하지 않았습니다. – akappa

+1

"답변을 수락하지 못했습니다"?? 나는 여기서 질문하고있다. 왜 내가 u는 어떤 질문도 받아들이지 않는다고 말했습니까? 2 개의 별난 대답!! – afancy

답변

1

FieldFilter와 put을 HDFS로 serialize 한 다음 나중에 HDFS API를 사용하여 매퍼/감속기 기능에서 읽습니다. 대규모 클러스터 인 경우 을 증가 시키십시오.이 값은 일련 화 된 FieldFilter 클래스에 대해 기본값 인 3으로 설정됩니다. 매퍼 및 판독기 태스크가 더 많아지면 직렬화 된 FieldFilter 클래스를 읽을 수 있기 때문입니다.

새 MapReduce API를 사용하면 Mapper.setup() 함수에서 직렬화 된 FieldFilter 파일을 읽을 수 있습니다. 이것은 맵 태스크의 초기화 중에 호출됩니다. 이전 MapReduce API와 비슷한 것을 찾을 수 없습니다.

DistributedCache을 사용하여 직렬화 된 FieldFilter 클래스를 다른 노드에 배포 할 수도 있습니다.

4

당신은 당신이 here을 볼 수 있습니다로 ConfigurationsetClass()을 사용하고 싶습니다. 그런 다음 클래스를 newInstance()으로 인스턴스화 할 수 있습니다. 매퍼/감속기의 setup() 메소드에서 인스턴스화를 수행해야하므로 map/reduce 메소드가 호출 될 때마다 필터를 인스턴스화하지 않도록하십시오. 행운을 빕니다.

- 편집. 컨텍스트를 통해 구성에 액세스 할 수 있다는 것을 추가해야합니다. 그러면 필요한 클래스를 얻는 방법입니다. 구성 api에는 메소드가 있습니다.