I am writing a Java implementation program in Hadoop MapReduce Framework. And I am writing aclass called CombinePatternReduce.class. In order to debug the reducer in Eclipse, I write a main() function as following:
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IOException, InterruptedException{
Text key = new Text("key2:::key1:::_ performs better than _");
IntWritable count5 = new IntWritable(5);
IntWritable count3 = new IntWritable(3);
IntWritable count8 = new IntWritable(8);
List<IntWritable> values = new ArrayList<IntWritable>();
values.add(count5);
values.add(count3);
values.add(count8);
CombinePatternReduce reducer = new CombinePatternReduce();
Context dcontext = new DebugTools.DebugReducerContext<Text, IntWritable, KeyPairWritableComparable, WrapperDoubleOrPatternWithWeightWritable>(reducer, key, count3); // here is the problem
reducer.reduce(key, values, dcontext);
}
The DebugTools.DebugReducerContext is a class that I write to make the debugging process easier to perform, and it is as following:
public static class DebugReducerContext<KIN, VIN, KOUT, VOUT> extends Reducer<KIN, VIN, KOUT, VOUT>.Context {
DebugTools dtools = new DebugTools();
DataOutput out = dtools.new DebugDataOutputStream(System.out);
public DebugReducerContext(Reducer<KIN, VIN, KOUT, VOUT> reducer, Class<KIN> keyClass, Class<VIN> valueClass) throws IOException, InterruptedException{
reducer.super(new Configuration(), new TaskAttemptID(), new DebugRawKeyValueIterator(), null, null,
null, null, null, null, keyClass, valueClass);
}
@Override
public void write(Object key, Object value) throws IOException, InterruptedException {
writeKeyValue(key, value, out);
}
@Override
public void setStatus(String status) {
System.err.println(status);
}
}
The problem is in the first part of code, namely main(). When I write
Context dcontext = new DebugTools.DebugReducerContext<Text, IntWritable, KeyPairWritableComparable, WrapperDoubleOrPatternWithWeightWritable>(reducer, key, count3);
There is an error that
The constructor DebugTools.DebugReducerContext<Text,IntWritable,KeyPairWritableComparable,WrapperDoubleOrPatternWithWeightWritable>(CombinePatternReduce, Text, IntWritable) is undefined.
When I write
Context dcontext = new DebugTools.DebugReducerContext<Text, IntWritable, KeyPairWritableComparable, WrapperDoubleOrPatternWithWeightWritable>(reducer, key, values);
There is an error that
The constructor DebugTools.DebugReducerContext<Text,IntWritable,KeyPairWritableComparable,WrapperDoubleOrPatternWithWeightWritable>(CombinePatternReduce, Text, List<IntWritable>) is undefined.
Since the documentation of Reducer.Context is
public Reducer.Context(Configuration conf,
TaskAttemptID taskid,
RawKeyValueIterator input,
Counter inputKeyCounter,
Counter inputValueCounter,
RecordWriter<KEYOUT,VALUEOUT> output,
OutputCommitter committer,
StatusReporter reporter,
RawComparator<KEYIN> comparator,
Class<KEYIN> keyClass,
Class<VALUEIN> valueClass)
throws IOException,
InterruptedException
I need to pass in a Class<KEYIN> keyClass and Class<VALUEIN> valueClass. So how can I write the main() function (especially the sentence with error) to debug the reducer class?
It’s very clear that the class constructor takes 3 parameters. An instance of a reducer, a class for the key, and a class for the value.
Instead of actually passing the key and value. You need to supply it with link to the class
Essentially this is reaffirming the type of values the context should be able to handle for reducing.