나는 분석하고자하는 특정 지표의 결과를 보여주기 위해 세계 지표 데이터를 가져 오는 mapreduce 프로그램을 만들었습니다. (I.E. CO2 배출). 데이터는 국가, 코드, 표시기, 1 년 배출량, 2 년 배출량 등을 포함하는 긴 줄에 표시됩니다. 내 매퍼에서는 원하는 데이터 만 유지하려고했습니다 (먼저 특정 표시기가있는 경우) 국가 및 모든 배출 수준을 문자열 배열로 유지합니다.MapReduce 빈 출력을 생성하는 프로그램
내 전체 프로그램이 실행되지만 Map 입력 레코드를 받고 있지만 Map 출력 레코드 또는 Reduce Input/Output 레코드가없는 것으로 나타났습니다.
나는 논리가 잘못되어 버린 곳을 찾아 내려고 노력하지만 계속 난처하게됩니다. 모든 입력을 부탁드립니다.
내 코드는 다음과 같습니다 :
--- Mapper--
package org.myorg;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class CO2Mapper extends Mapper <LongWritable, Text, Text, IntWritable>
{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String delims = ",";
String splitString = value.toString();
String[] tokens = splitString.split(delims);
int tokenCount = tokens.length;
String country = tokens[1];
String indicator = tokens[3];
int levels;
if(indicator.equals("EN.ATM.CO2E.KT"))
{
for (int j = 4; j < tokenCount; j++)
{
levels = Integer.parseInt(tokens[j]);
context.write(new Text(country), new IntWritable(levels));
}
}
}
}
---- 감속기 ---
package org.myorg;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class CO2Reducer extends Reducer<Text, IntWritable, Text, IntWritable>
{
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
{
int maxValue = Integer.MIN_VALUE;
int minValue = Integer.MAX_VALUE;
for(IntWritable val : values)
{
maxValue = Math.max(maxValue, val.get());
minValue = Math.min(minValue, val.get());
}
context.write(key, new IntWritable(maxValue));
context.write(key, new IntWritable(minValue));
}
}
--- 주요 ---
package org.myorg;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
//import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
public class CO2Levels
{
public static void main(String[] args) throws Exception
{
//with mapreduce
Configuration conf = new Configuration();
Job job = new Job(conf, "co2Levels");
//Job job = new Job();
job.setJarByClass(CO2Levels.class);
//job.setJobName("co2Levels");
job.setMapperClass(CO2Mapper.class);
job.setReducerClass(CO2Reducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setInputFormatClass(TextInputFormat.class);
//job.setInputFormatClass(KeyValueTextInputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
디버거를 사용하여 코드를 단계별로 실행하고 단일 입력 집합에 대한 동작을 관찰 해 보았습니까? – voidHead
몇 가지 샘플 입력 텍스트를 제공 할 수 있습니까? – blackSmith
Ur 프로그램이 좋습니다. 나는 문제가 입력에 있다고 생각한다. 아마도 파일의 4 번째 열에는 필수 값이 포함되어 있지 않으므로'if (indicator.equals ("EN.ATM.CO2E.KT")) 조건은 실패합니다. – blackSmith