복붙노트

[HADOOP] hadoop의 모든 매퍼에게 객체 사본을 전달하는 모범 사례

HADOOP

hadoop의 모든 매퍼에게 객체 사본을 전달하는 모범 사례

안녕하세요, 저는 현재 Map Reduce를 배우고 hadoop 1.0.4로 작은 작업을 작성하려고합니다. 중지 단어 목록과 패턴 목록이 있습니다. 내 파일을 매핑하기 전에 맵과 같은 효율적인 데이터 구조에 stoppword를로드하려고합니다. 또한 패턴 목록에서 하나의 정규식 패턴을 만들고 싶습니다. 이것들은 직렬 작업이기 때문에 매핑 앞에서 수행하고 모든 매퍼에게 사본을 읽고 쓸 수있는 객체로 전달하려고합니다. 드라이버 클래스에서 getter를 사용하여 정적 변수를 사용하는 것에 대해 생각했지만 포인터 원리로 java 호출 객체를 사용하면 이것이 작동하지 않습니다. 물론 그것을 전달하기 전에 객체를 복제 할 수는 있지만 실제로는 좋은 습관처럼 보이지 않습니다. 분산 캐시에 대한 내용을 읽었지만 파일에 대해서만 이해하고 객체에 대한 것이 아니라 모든 매퍼가 중지 단어 / 패턴 파일을 읽도록 할 수있는 것 이상을 읽었습니다.

도움을 주셔서 감사합니다!

해결법

  1. ==============================

    1.가능한 해결책은 작업을 실행하기 전에 stopwords.txt를 HDFS에 복사하는 것입니다. 그런 다음 Mapper의 설정 방법에서 적절한 데이터 구조로 읽습니다. 예 :

    가능한 해결책은 작업을 실행하기 전에 stopwords.txt를 HDFS에 복사하는 것입니다. 그런 다음 Mapper의 설정 방법에서 적절한 데이터 구조로 읽습니다. 예 :

    MyMapper 클래스 :

    ...
    private Map<String, Object> stopwords = null;
    
    @Override
    public void setup(Context context) {
        Configuration conf = context.getConfiguration();
        //hardcoded or set it in the jobrunner class and retrieve via this key
        String location = conf.get("job.stopwords.path");
        if (location != null) {
            BufferedReader br = null;
            try {
                FileSystem fs = FileSystem.get(conf);
                Path path = new Path(location);
                if (fs.exists(path)) {
                    stopwords = new HashMap<String, Object>();
                    FSDataInputStream fis = fs.open(path);
                    br = new BufferedReader(new InputStreamReader(fis));
                    String line = null;
                    while ((line = br.readLine()) != null && line.trim().length() > 0) {
                        stopwords.put(line, null);
                    }
                }
            }
            catch (IOException e) {
                //handle
            } 
            finally {
                IOUtils.closeQuietly(br);
            }
        }
    }
    ...
    

    그런 다음 맵 메소드에서 중지 단어를 사용할 수 있습니다.

    또 다른 옵션은 jobrunner 클래스에서 중지 단어를 사용하여 맵 오브젝트를 작성하는 것입니다. Base64로 인코딩 된 문자열로 직렬화하고 구성 객체의 일부 키 값으로 매퍼에 전달한 다음 설정 방법에서 역 직렬화합니다.

    첫 번째 옵션을 선택하는 것이 더 쉬울뿐 아니라 Configuration 객체를 통해 더 많은 양의 데이터를 전달하는 것이 좋지 않기 때문에 선택했습니다.

  2. ==============================

    2.하둡 분산 캐시는 일부 참조 데이터를 매퍼에 전달하기위한 메커니즘입니다. 성능 관점에서는 데이터가 작업 당 한 번이 아니라 노드 당 한 번 HDFS에서 로컬 파일 시스템으로 전달되므로 HDFS에서로드하는 것이 좋습니다. 당신은 완전히 옳습니다-파일과 파일을 읽기위한 것이며 데이터 구조로 변환하는 것은 당신의 책임입니다. 내가 아는 한 hadoop은 객체 전달을 지원하지 않습니다. 이 파일들에서 어떤 종류의 직렬화를 사용한다면-그것은 당신이 요구하는 것에 가깝습니다.

    하둡 분산 캐시는 일부 참조 데이터를 매퍼에 전달하기위한 메커니즘입니다. 성능 관점에서는 데이터가 작업 당 한 번이 아니라 노드 당 한 번 HDFS에서 로컬 파일 시스템으로 전달되므로 HDFS에서로드하는 것이 좋습니다. 당신은 완전히 옳습니다-파일과 파일을 읽기위한 것이며 데이터 구조로 변환하는 것은 당신의 책임입니다. 내가 아는 한 hadoop은 객체 전달을 지원하지 않습니다. 이 파일들에서 어떤 종류의 직렬화를 사용한다면-그것은 당신이 요구하는 것에 가깝습니다.

  3. from https://stackoverflow.com/questions/13501276/best-practice-to-pass-copy-of-object-to-all-mappers-in-hadoop by cc-by-sa and MIT license