복붙노트

[HADOOP] \ n \ n을 \ n으로 변환하고 ARC 형식을 깨는 hadoop

HADOOP

\ n \ n을 \ n으로 변환하고 ARC 형식을 깨는 hadoop

내가 hadoop 스트리밍을 사용하여 commoncrawl.org에서 데이터를 구문 분석하려고합니다. 내 코드를 테스트하기 위해 로컬 hadoop을 설정하고 스트리밍 ARCfile 리더를 사용하는 간단한 루비 매퍼를 사용한다. 내가 직접 내 코드를 호출하면

cat 1262876244253_18.arc.gz | mapper.rb | reducer.rb

그것은 예상대로 작동합니다.

hadoop은 파일의 확장자가 .gz 인 것을 자동으로 확인하고 매퍼에 넘겨주기 전에 압축을 해제하는 것으로 보이지만 그렇게하는 동안 \ r \ n 스트림의 줄 바꿈은 \ n으로 변환됩니다. ARC는 헤더 행의 레코드 길이에 의존하기 때문에 변경으로 인해 파서가 손상됩니다 (데이터 길이가 변경 되었기 때문에).

다시 확인하기 위해 필자는 매퍼가 압축되지 않은 데이터를 예상하도록 변경했으며 다음을 수행했습니다.

cat 1262876244253_18.arc.gz | zcat | mapper.rb | reducer.rb

그리고 그것은 작동합니다.

내가 자동으로 압축 풀기 (비록 내가 아주 행복하게 스트리밍 .gz 파일을 처리 할 수 ​​있지만), butoop 괜찮아요 상관 없어요. 만약 내가 그것을 '바이너리'에서 어떤 linebreak 변환 또는 비슷한 일을하지 않고 압축을 풀 필요가있다. 기본 동작은 파일 당 하나의 매퍼에 압축 해제 된 파일을 공급하는 것이라고 생각합니다. 이는 완벽합니다.

어떻게하면 압축을 풀지 말고 .gz (파일 이름 바꾸기는 옵션이 아닙니다) 또는 압축을 올바르게 풀어 낼 수 있습니까? 가능하다면 항아리에 넣어야하는 특수한 InputFormat 클래스를 사용하지 않기를 바란다.

이 모든 것은 결국 AWS ElasticMapReduce에서 실행됩니다.

해결법

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

    1.Hadoop PipeMapper.java가 비난받을 것으로 보입니다 (적어도 0.20.2) :

    Hadoop PipeMapper.java가 비난받을 것으로 보입니다 (적어도 0.20.2) :

    라인 106 주변에서 TextInputFormat의 입력이이 매퍼 (\ r \ n이 제거 된 단계)로 전달되고 PipeMapper가 \ n을 사용하여 stdout에이를 작성합니다.

    제안은 PipeMapper.java의 소스를 수정하고,이 '기능'이 여전히 존재하는지 확인하고, 필요에 따라 수정합니다 (설정 속성을 통해 설정되도록 허용 할 수 있음).

  2. from https://stackoverflow.com/questions/8999734/hadoop-converting-r-n-to-n-and-breaking-arc-format by cc-by-sa and MIT license