我的映射器会将一些数据写入本地磁盘并在映射器完成时将其清理干净。但是,如果发生错误(发生异常),则不会调用cleanup()方法。 我可以在我的映射器中捕获异常,但是我无法处理在我的映射器中未调用的异常(例如:作业跟踪器故障转移到备用节点)。
当映射器出现故障时,有什么办法可以清理吗?
答案 0 :(得分:2)
您可以覆盖mapper的run方法,在上下文中包含输入键迭代的try / catch,并确保调用cleanup:
@Override
public void run() {
setup(context);
try {
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
}
}
您需要确保清理方法中没有任何逻辑来尝试输出记录,或者在映射器中设置一个标记来表示发生了错误。
这可能无法防止所有类型的任务失败(例如JVM崩溃),我认为你没有任何其他方法,除了可能在原始工作之后运行工作,其作用是确保使用的资源得到了适当的清理。
答案 1 :(得分:0)
使用作业类,如果作业完成,你肯定可以删除一些文件夹,即使目录在本地文件系统中,也可以使用 FileSystem 类