복붙노트

[HADOOP] 빈 출력 파일은 하둡 작업을 실행 한 후 생성

HADOOP

빈 출력 파일은 하둡 작업을 실행 한 후 생성

나는 아래와 같이 맵리 듀스 프로그램이

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextOutputFormat;

public class Sample {

public static class SampleMapper extends MapReduceBase implements
        Mapper<Text, Text, Text, Text> {

    private Text word = new Text();

    @Override
    public void map(Text key, Text value,
            OutputCollector<Text, Text> output, Reporter reporter)
            throws IOException {
        StringTokenizer itr = new StringTokenizer(value.toString(),",");
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            output.collect(key, word);
        }
    }
}

public static class SampleReducer extends MapReduceBase implements
        Reducer<Text, Text, Text, Text> {

    private Text result = new Text();

    @Override
    public void reduce(Text key, Iterator<Text> values,
            OutputCollector<Text, Text> output, Reporter reporter)
            throws IOException {

        StringBuffer aggregation = new StringBuffer();
        while (values.hasNext()) {
            aggregation.append("|" + values.next().toString());
        }
        result.set(aggregation.toString());
        output.collect(key, result);
    }

}

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

    conf.setMapperClass(SampleMapper.class);
    conf.setReducerClass(SampleReducer.class);
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(Text.class);
    conf.setInputFormat(KeyValueTextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);
    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));

    JobClient.runJob(conf);

}
}

나는 항아리를했습니다 나는 출력을 얻으려고 간 적이 있었다. 그러나 생성되는 출력 파일이 비어 있습니다.

나는 작업을 실행하려면 다음 명령을 사용하고 있습니다

hadoop jar mapreduce.jar Sample /tmp/input tmp/output

mapreduce.jar 내가 포장 한 단지이며, 내 입력 파일은 같다

1 a,b,c
2 e,f
1 x,y,z
2 g

예상 출력

1 a|b|c|x|y|z
2 e|f|g

해결법

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

    1.난 당신이이 separater 바이트를 찾지 못하는 것 때문에 키로 전체 라인 값을 사용하고 입력 형식으로 KeyValueTextInputFormat을 사용하고 있기 때문에 (값하는 ""입니다) 같은데요. 즉, 매퍼에 반복이 어떤 루프를 통과하지 않으며 아무것도 기입하지 않습니다 것을 의미합니다. 분리 바이트로 "」를 개최하기 위해 설정에서 속성 이름 mapreduce.input.keyvaluelinerecordreader.key.value.separator을 사용합니다.

    난 당신이이 separater 바이트를 찾지 못하는 것 때문에 키로 전체 라인 값을 사용하고 입력 형식으로 KeyValueTextInputFormat을 사용하고 있기 때문에 (값하는 ""입니다) 같은데요. 즉, 매퍼에 반복이 어떤 루프를 통과하지 않으며 아무것도 기입하지 않습니다 것을 의미합니다. 분리 바이트로 "」를 개최하기 위해 설정에서 속성 이름 mapreduce.input.keyvaluelinerecordreader.key.value.separator을 사용합니다.

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

    2.JobConf에 구성 개체를 전달하려고, 나는 당신의 JobConf는 하둡 / HDFS 구성을 얻을 수없는 것 같아요.

    JobConf에 구성 개체를 전달하려고, 나는 당신의 JobConf는 하둡 / HDFS 구성을 얻을 수없는 것 같아요.

    Configuration configuration=new Configuration();
    JobConf jobconf=new JobConf(configuration, exampleClass.class);
    conf2.setJarByClass(cls);
    .......
    
  3. from https://stackoverflow.com/questions/12780407/empty-output-file-generated-after-running-hadoop-job by cc-by-sa and MIT license