복붙노트

[HADOOP] hadoop-streaming에 파일이 아닌 디렉토리를 전달 하시겠습니까?

HADOOP

hadoop-streaming에 파일이 아닌 디렉토리를 전달 하시겠습니까?

제 직업에서는 많은 역사적 로그 세트를 파싱 할 필요가 있습니다. 개별 고객 (수천 명이 있음)에는 수백 개의 로그 하위 디렉토리가 날짜별로 구분되어있을 수 있습니다. 예 :

각각의 개별 로그 세트는 그 자체로 5 또는 6 레벨의 깊이를 가질 수 있으며 수천 개의 파일을 포함 할 수 있습니다.

따라서 개별지도 작업이 서브 디렉토리를 처리하는 것을 실제로 원합니다. 단순히 개별 파일을 열거하면 분산 된 컴퓨팅 문제의 일부입니다!

불행히도, 로그 서브 디렉토리 만 포함하는 디렉토리를 Hadoop으로 전달하려고하면, 해당 서브 디렉토리를 내 매퍼로 전달할 수 없다는 불만이 있습니다. (다시 말하자면, 서브 디렉토리를 입력으로 받아들이도록 작성했습니다).

$ hadoop jar "$ {HADOOP_HOME} / contrib / streaming / hadoop-streaming - $ {HADOOP_VERSION} .jar"- 입력 파일 : /// mnt / logs / Customer_Name / -file mapper.sh -mapper "mapper.sh"- 파일 감속기 .sh - 출력기 "감속기 .sh"- 출력.

[ . . . ]

12/04/10 12:48:35 오류 security.UserGroupInformation : PriviledgedActionException 다음과 같이 : cloudera (auth : SIMPLE) 원인 : java.io.IOException : 파일이 아닙니다 : file : / mnt / logs / Customer_Name / 2011-05-20 -003 12/04/10 12:48:35 오류 streaming.StreamJob : 오류 시작 작업 : 파일이 아닙니다 : file : / mnt / logs / Customer_Name / 2011-05-20-003 스트리밍 명령이 실패했습니다! [cloudera @ localhost ~] $

해결법

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

    1.나는 당신이 루트 디렉토리도 전달할 수있는 커스텀 InputFormat을 작성해야 할지를 조사 할 필요가있다. 각 고객을위한 분할을 생성 할 것이고, 각 분할을위한 레코드 판독기는 디렉토리 walk를 수행하고 파일 내용을 매퍼에게 푸시한다.

    나는 당신이 루트 디렉토리도 전달할 수있는 커스텀 InputFormat을 작성해야 할지를 조사 할 필요가있다. 각 고객을위한 분할을 생성 할 것이고, 각 분할을위한 레코드 판독기는 디렉토리 walk를 수행하고 파일 내용을 매퍼에게 푸시한다.

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

    2.Hadoop은 입력 경로를 정규 표현식으로 지원합니다. 복잡한 정규 표현식을 많이 실험하지는 않았지만 간단한 자리 표시 자입니까? 그리고 * 작동합니다.

    Hadoop은 입력 경로를 정규 표현식으로 지원합니다. 복잡한 정규 표현식을 많이 실험하지는 않았지만 간단한 자리 표시 자입니까? 그리고 * 작동합니다.

    그래서 귀하의 입력 경로로 다음과 같이 작동한다면 귀하의 경우에 나는 생각 :

    file:///mnt/logs/Customer_Name/*/*
    

    최종 별표는 최종 디렉토리의 모든 파일이 입력 경로로 자동 추가되므로 필요하지 않을 수 있습니다.

  3. from https://stackoverflow.com/questions/10095717/pass-directories-not-files-to-hadoop-streaming by cc-by-sa and MIT license