복붙노트

[HADOOP] Hadoop MapReduce 작업을 실행할 때 파일 이름 / 파일 내용을 MAP의 키 / 값 입력으로 가져 오는 방법은 무엇입니까?

HADOOP

Hadoop MapReduce 작업을 실행할 때 파일 이름 / 파일 내용을 MAP의 키 / 값 입력으로 가져 오는 방법은 무엇입니까?

PDF, DOC 및 DOCX 파일을 분석하는 프로그램을 만들고 있습니다. 이 파일들은 HDFS에 저장됩니다.

MapReduce 작업을 시작할 때 Map 함수가 Filename as Key와 Binary Contents as 값을 값으로 갖기를 원합니다. 그런 다음 PDF 파서 라이브러리에 전달할 수있는 스트림 리더를 만들고 싶습니다. 지도 단계의 키 / 값 쌍이 파일 이름 / 파일 내용인지 어떻게 확인할 수 있습니까?

Hadoop 0.20.2를 사용 중입니다.

작업을 시작하는 이전 코드입니다.

public static void main(String[] args) throws Exception {
 JobConf conf = new JobConf(PdfReader.class);
 conf.setJobName("pdfreader");

 conf.setOutputKeyClass(Text.class);
 conf.setOutputValueClass(IntWritable.class);

 conf.setMapperClass(Map.class);
 conf.setReducerClass(Reduce.class);

 conf.setInputFormat(TextInputFormat.class);
 conf.setOutputFormat(TextOutputFormat.class);

 FileInputFormat.setInputPaths(conf, new Path(args[0]));
 FileOutputFormat.setOutputPath(conf, new Path(args[1]));

 JobClient.runJob(conf);
}

다른 입력 형식 유형이 있다는 것을 알고 있습니다. 그러나 내가 원하는 것을 정확하게하는 사람이 있습니까? 설명서가 매우 모호합니다. 사용할 수있는 맵 함수가있는 경우 Map 함수 입력 유형이 어떻게 표시되어야합니까?

미리 감사드립니다.

해결법

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

    1.이에 대한 해결책은이 작업을 수행하는 고유 한 FileInputFormat 클래스를 만드는 것입니다. 이 FileInputFormat이 수신하는 FileSplit에서 입력 파일의 이름에 액세스 할 수 있습니다 (getPath). 항상 false를 반환하도록 FileInputformat의 isSplitable을 오버랩해야합니다.

    이에 대한 해결책은이 작업을 수행하는 고유 한 FileInputFormat 클래스를 만드는 것입니다. 이 FileInputFormat이 수신하는 FileSplit에서 입력 파일의 이름에 액세스 할 수 있습니다 (getPath). 항상 false를 반환하도록 FileInputformat의 isSplitable을 오버랩해야합니다.

    또한 전체 파일을 단일 "레코드"값으로 반환하는 사용자 정의 RecordReader가 필요합니다.

    너무 큰 파일을 처리 할 때는주의하십시오. RAM에 전체 파일을 효과적으로로드하고 작업 추적기의 기본 설정은 사용 가능한 RAM이 200MB 밖에되지 않는 것입니다.

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

    2.당신의 접근 방식 대신, 바이너리 파일을 hdfs에 직접 추가 할 수도 있습니다. 그런 다음, 모든 2 진 파일에 대한 dfs 경로가 들어있는 입력 파일을 작성하십시오. 이것은 Hadoop의 FileSystem 클래스를 사용하여 동적으로 수행 할 수 있습니다. 마지막으로 FileSystem을 사용하여 입력 스트림을 열어 입력을 처리하는 매퍼를 만듭니다.

    당신의 접근 방식 대신, 바이너리 파일을 hdfs에 직접 추가 할 수도 있습니다. 그런 다음, 모든 2 진 파일에 대한 dfs 경로가 들어있는 입력 파일을 작성하십시오. 이것은 Hadoop의 FileSystem 클래스를 사용하여 동적으로 수행 할 수 있습니다. 마지막으로 FileSystem을 사용하여 입력 스트림을 열어 입력을 처리하는 매퍼를 만듭니다.

  3. ==============================

    3.WholeFileInputFormat (https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/?r=3)을 사용할 수 있습니다.

    WholeFileInputFormat (https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/?r=3)을 사용할 수 있습니다.

    이 명령으로 얻을 수있는 파일의 매퍼 이름 :

    public void map(NullWritable key, BytesWritable value, Context context) throws 
    IOException, InterruptedException 
    {       
    
    Path filePath= ((FileSplit)context.getInputSplit()).getPath();
    String fileNameString = filePath.getName();
    
    byte[] fileContent = value.getBytes();
    
    }
    
  4. from https://stackoverflow.com/questions/5716138/how-to-get-filename-file-contents-as-key-value-input-for-map-when-running-a-hado by cc-by-sa and MIT license