昨天在修改自己程序的时候运到一个问题,首先修改程序的原因是修改前的版本所有逻辑处理都在map中执行,没有用到reduce。后来觉得将一部分逻辑处理放在map,一部分让在reduce中。
在重写reduce方法后部署到集群中运行reduce方法体中代码不能运行,起初以为是job配置时写错了format。经过多次调整并确保格式没有任何问题,那问题到底在哪呢,我们看看重写的reduce方法:
这是我之前的reduce方法,输入输出都为Text,
public class ExtractorReducer extends Reducer<Text, Text, Text, Text>{
public void reduce(Text key, Iterator<Text> inValues, Context context) throws IOException {
}
后来在重写方法的前面加上@Override后就报错了。根据这个情况仔细看了下原来是Iterator错了,0.20.2改成了Iterable,而Iterator还是0.19的写法。
public class ExtractorReducer extends Reducer<Text, Text, Text, Text>{
@Override
public void reduce(Text key, Iterable<Text> inValues, Context context) throws IOException {
}
终于可以运行,给我提了个醒,如下:
1 要细心观察,看看那错了,不能大意。
2 重写方法前加上@Override,这个很有好处的。
在重写reduce方法后部署到集群中运行reduce方法体中代码不能运行,起初以为是job配置时写错了format。经过多次调整并确保格式没有任何问题,那问题到底在哪呢,我们看看重写的reduce方法:
这是我之前的reduce方法,输入输出都为Text,
public class ExtractorReducer extends Reducer<Text, Text, Text, Text>{
public void reduce(Text key, Iterator<Text> inValues, Context context) throws IOException {
}
后来在重写方法的前面加上@Override后就报错了。根据这个情况仔细看了下原来是Iterator错了,0.20.2改成了Iterable,而Iterator还是0.19的写法。
public class ExtractorReducer extends Reducer<Text, Text, Text, Text>{
@Override
public void reduce(Text key, Iterable<Text> inValues, Context context) throws IOException {
}
终于可以运行,给我提了个醒,如下:
1 要细心观察,看看那错了,不能大意。
2 重写方法前加上@Override,这个很有好处的。