清除失败的Map

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

我的Map程序会将一些数据写入本地磁盘,并在Map程序完成时进行清理。但是,如果发生错误(发生异常),则不会调用cleanup()方法。我可以在Map器中捕获异常,但无法处理Map器中未调用的异常(例如:job tracker故障转移到备用节点)。
有什么方法可以在mapper get失败时进行清理吗?

svmlkihl

svmlkihl1#

您可以重写mapper的run方法,以便在上下文中输入键的迭代周围包含try/catch,并确保调用cleanup:

@Override
public void run() {
  setup(context);

  try {
    while (context.nextKeyValue()) {
      map(context.getCurrentKey(), context.getCurrentValue(), context);
    }
  } finally {
    cleanup(context);
  }
}

您需要确保清除方法中没有任何逻辑来尝试输出记录,或者在Map器中设置一个标志来指示发生了错误。
这可能无法防止所有类型的任务失败(例如jvm崩溃),对于这种情况,我认为除了在原始作业之后运行一个作业(其作用是确保正确清理使用的资源)之外,没有其他方法。

taor4pac

taor4pac2#

如果作业完成,使用job类可以删除一些文件夹,即使目录在本地文件系统中,也可以使用filesystem类
关于hadoop中文件系统的更多信息

相关问题