[HADOOP] 새 Hadoop API를 사용하여 MultipleTextOutputFormat을 사용하려면 어떻게해야합니까?
HADOOP새 Hadoop API를 사용하여 MultipleTextOutputFormat을 사용하려면 어떻게해야합니까?
여러 개의 출력 파일을 작성하고 싶습니다. JobConf 대신 Job을 사용하여이 작업을 수행하려면 어떻게해야합니까?
해결법
-
==============================
1.키 기반 출력 파일 이름을 만드는 쉬운 방법
키 기반 출력 파일 이름을 만드는 쉬운 방법
input data type //key //value cupertino apple sunnyvale banana cupertino pear
MultipleTextOutputFormat 클래스
static class KeyBasedMultipleTextOutputForma extends MultipleTextOutputFormat<Text, Text> { @Override protected String generateFileNameForKeyValue(Text key, Text value, String name) { return key.toString() + "/" + name; } }
작업 구성
job.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);
이 코드를 실행하면 / output이 작업 출력 디렉토리 인 HDFS에 다음 파일이 표시됩니다.
$ hadoop fs -ls /output /output/cupertino/part-00000 /output/sunnyvale/part-00000
도움이되기를 바랍니다.
-
==============================
2.문서는 대신 org.apache.hadoop.mapreduce.lib.output.MultipleOutputs를 사용한다고 말합니다.
문서는 대신 org.apache.hadoop.mapreduce.lib.output.MultipleOutputs를 사용한다고 말합니다.
아래는 MultipleOutputs를 사용하는 코드 스 니펫입니다. 불행히도 나는 그것을 쓰지 않고 많은 시간을 보냈다 ... 그래서 나는 물건이 어디에 있는지 정확히 알지 못한다. 도움이되기를 희망합니다. :)
작업 설정
job.setJobName("Job Name"); job.setJarByClass(ETLManager.class); job.setMapOutputKeyClass(Text.class); job.setOutputKeyClass(NullWritable.class); job.setMapOutputValueClass(MyThing.class); job.setMapperClass(MyThingMapper.class); job.setReducerClass(MyThingReducer.class); MultipleOutputs.addNamedOutput(job, Constants.MyThing_NAMED_OUTPUT, TextOutputFormat.class, NullWritable.class, Text.class); job.setInputFormatClass(MyInputFormat.class); FileInputFormat.addInputPath(job, new Path(conf.get("input"))); FileOutputFormat.setOutputPath(job, new Path(String.format("%s/%s", conf.get("output"), Constants.MyThing_NAMED_OUTPUT)));
감속기 설정
public class MyThingReducer extends Reducer<Text, MyThing, NullWritable, NullWritable> { private MultipleOutputs m_multipleOutputs; @Override public void setup(Context context) { m_multipleOutputs = new MultipleOutputs(context); } @Override public void cleanup(Context context) throws IOException, InterruptedException { if (m_multipleOutputs != null) { m_multipleOutputs.close(); } } @Override public void reduce(Text key, Iterable<MyThing> values, Context context)throws IOException, InterruptedException { for (MyThing myThing : values) { m_multipleOutputs.write(Constants.MyThing_NAMED_OUTPUT, EMPTY_KEY, generateData(context, myThing), generateFileName(context, myThing)); context.progress(); } } }
편집 : MultipleOutputs에 대한 링크를 추가했습니다.
from https://stackoverflow.com/questions/6272307/how-do-i-use-the-multipletextoutputformat-using-the-new-hadoop-api by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 모든 쿼리의 하이브 오류 : 작업 핸들과 관련된 로그를 찾을 수 없습니다. (0) | 2019.07.29 |
---|---|
[HADOOP] hadoop 설치를 찾을 수 없습니다 : $ HADOOP_HOME이 설정되어 있거나 hadoop이 경로에 있어야합니다. (0) | 2019.07.29 |
[HADOOP] MRJob에서 각지도 단계의 입력을 구체적으로 결정하는 방법은 무엇입니까? (0) | 2019.07.29 |
[HADOOP] Hadoop : 사용자 정의 FileInputFormat 클래스 구현시 필요한 도움말 (0) | 2019.07.29 |
[HADOOP] HDFS의 저장소 형식 (0) | 2019.07.29 |