java—在reducer代码中以编程方式停止作业

6ovsh4lw  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(227)

假设我在reducer代码的输入键/值中检测到一些东西,什么代码应该实际运行以使reducer不再继续,输出处发出的任何记录都会写入输出文件,并且作业停止,不再发生reduce?

huwehgph

huwehgph1#

在这种情况下,hadoop集群上必须运行多个reducer。因此,即使您在输入中检测到错误并尝试停止它,您也不能确定状态是否一致(即,一旦接收到错误的输入,就不会处理任何记录),因为多个还原器可能会并行处理多个记录。
所以我不认为停止这项工作是个好主意。

9rygscc1

9rygscc12#

停止工作可能不是个好主意。但如果需要,一种方法是创建自己的异常类,或者扩展其中一种 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都不会提交文件。而那些已经完成的减速机,本来就已经投入产出了。

相关问题