假设我在reducer代码中检测输入键/值中的某些内容,应该实际运行哪些代码以使reducer不再继续,输出中的任何发出的记录都会写入输出文件并且作业将停止没有进一步减少发生?
答案 0 :(得分:1)
可能是必须在hadoop集群上运行多个Reducer的情况。因此,即使您在输入中检测到错误并尝试停止它,您也不确定状态是否一致(即,一旦收到错误输入,就不会处理任何记录),因为多个记录可能由多个并行处理器同时处理。 / p>
所以我不认为停止工作是个好主意。
答案 1 :(得分:1)
停止工作可能不是一个好主意。
但是如果你需要它,一种方法是创建你自己的异常类,可能扩展InterruptedException
或IOException
,并在你想要退出时出现条件时抛出异常。
您的异常类可能如下:
Class QuitReducerException extends InterruptedException {
//Parameterless Constructor
public QuitReducerException() {}
//Constructor that accepts a message
public QuitReducerException(String message)
{
super(message);
}
}
在您的reduce方法中,您可以按如下方式使用它:
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException,InterruptedException {
...
if(<condition to quit happen>){
throw new QuitReducerException("Quitting reducer due to some specified reason");// You may add details of the reason you are quitting and this will be available in the job logs (in stderr)
}
...
}
PS:这不能确保当前reducer发出的输出会被提交到输出文件。此外,任何其他未完成的reducer都不会提交文件。虽然已经完成的减速器已经提交了它们的输出。