我的Map程序会将一些数据写入本地磁盘,并在Map程序完成时进行清理。但是,如果发生错误(发生异常),则不会调用cleanup()方法。我可以在Map器中捕获异常,但无法处理Map器中未调用的异常(例如:job tracker故障转移到备用节点)。有什么方法可以在mapper get失败时进行清理吗?
svmlkihl1#
您可以重写mapper的run方法,以便在上下文中输入键的迭代周围包含try/catch,并确保调用cleanup:
@Overridepublic void run() { setup(context); try { while (context.nextKeyValue()) { map(context.getCurrentKey(), context.getCurrentValue(), context); } } finally { cleanup(context); }}
@Override
public void run() {
setup(context);
try {
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
您需要确保清除方法中没有任何逻辑来尝试输出记录,或者在Map器中设置一个标志来指示发生了错误。这可能无法防止所有类型的任务失败(例如jvm崩溃),对于这种情况,我认为除了在原始作业之后运行一个作业(其作用是确保正确清理使用的资源)之外,没有其他方法。
taor4pac2#
如果作业完成,使用job类可以删除一些文件夹,即使目录在本地文件系统中,也可以使用filesystem类关于hadoop中文件系统的更多信息
2条答案
按热度按时间svmlkihl1#
您可以重写mapper的run方法,以便在上下文中输入键的迭代周围包含try/catch,并确保调用cleanup:
您需要确保清除方法中没有任何逻辑来尝试输出记录,或者在Map器中设置一个标志来指示发生了错误。
这可能无法防止所有类型的任务失败(例如jvm崩溃),对于这种情况,我认为除了在原始作业之后运行一个作业(其作用是确保正确清理使用的资源)之外,没有其他方法。
taor4pac2#
如果作业完成,使用job类可以删除一些文件夹,即使目录在本地文件系统中,也可以使用filesystem类
关于hadoop中文件系统的更多信息