[HADOOP] Hadoop MapReduce 작업을 실행할 때 파일 이름 / 파일 내용을 MAP의 키 / 값 입력으로 가져 오는 방법은 무엇입니까?
HADOOPHadoop 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.이에 대한 해결책은이 작업을 수행하는 고유 한 FileInputFormat 클래스를 만드는 것입니다. 이 FileInputFormat이 수신하는 FileSplit에서 입력 파일의 이름에 액세스 할 수 있습니다 (getPath). 항상 false를 반환하도록 FileInputformat의 isSplitable을 오버랩해야합니다.
이에 대한 해결책은이 작업을 수행하는 고유 한 FileInputFormat 클래스를 만드는 것입니다. 이 FileInputFormat이 수신하는 FileSplit에서 입력 파일의 이름에 액세스 할 수 있습니다 (getPath). 항상 false를 반환하도록 FileInputformat의 isSplitable을 오버랩해야합니다.
또한 전체 파일을 단일 "레코드"값으로 반환하는 사용자 정의 RecordReader가 필요합니다.
너무 큰 파일을 처리 할 때는주의하십시오. RAM에 전체 파일을 효과적으로로드하고 작업 추적기의 기본 설정은 사용 가능한 RAM이 200MB 밖에되지 않는 것입니다.
-
==============================
2.당신의 접근 방식 대신, 바이너리 파일을 hdfs에 직접 추가 할 수도 있습니다. 그런 다음, 모든 2 진 파일에 대한 dfs 경로가 들어있는 입력 파일을 작성하십시오. 이것은 Hadoop의 FileSystem 클래스를 사용하여 동적으로 수행 할 수 있습니다. 마지막으로 FileSystem을 사용하여 입력 스트림을 열어 입력을 처리하는 매퍼를 만듭니다.
당신의 접근 방식 대신, 바이너리 파일을 hdfs에 직접 추가 할 수도 있습니다. 그런 다음, 모든 2 진 파일에 대한 dfs 경로가 들어있는 입력 파일을 작성하십시오. 이것은 Hadoop의 FileSystem 클래스를 사용하여 동적으로 수행 할 수 있습니다. 마지막으로 FileSystem을 사용하여 입력 스트림을 열어 입력을 처리하는 매퍼를 만듭니다.
-
==============================
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(); }
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
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 테이블을 Google BigQuery로 이전 (0) | 2019.06.09 |
---|---|
[HADOOP] java.lang.RuntimeException을 해결하는 방법 : PipeMapRed.waitOutputThreads () : 서브 프로세스가 코드 2로 실패 했습니까? (0) | 2019.06.09 |
[HADOOP] 파일은 언제 "분할 가능"합니까? (0) | 2019.06.09 |
[HADOOP] hadoop에로드 된 OpenCV 라이브러리가 작동하지 않습니다. (0) | 2019.06.09 |
[HADOOP] Spark를 사용하여 디렉토리에서 Hadoop 파일을 재귀 적으로 읽는 방법? (0) | 2019.06.09 |