2013-11-04 35 views
0

我的映射器会将一些数据写入本地磁盘,并在映射器完成时清理它。但是,如果发生错误(发生异常),则不会调用cleanup()方法。 我可以在我的映射器中捕获异常,但我无法处理未在映射器中调用的异常(例如:作业跟踪器故障转移到备用节点)。清理失败的地图

当映射器失败时,我有什么办法可以清理吗?

+0

我不知道,你知道临时文件的位置:它在mapred.local.dir中指定,因此删除它们应该是您的计划B.通常,作业会在完成后为您进行清理,但如果它遇到问题,您可能必须执行它手动。如果守护进程仍然存在,您可以尝试并格式化namenode。 – DDW

+0

我的映射器将数据写入本地磁盘(实际上是RAMDisk),而不是HDFS。映射器应该删除自己写入的文件。 – avhacker

回答

2

您可以覆盖映射器的运行方法,包括一个try/catch围绕输入键从上下文迭代,并确保清理被称为:

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

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

你需要确保你的清理方法没有任何逻辑来尝试输出记录,或者在映射器中设置一个标志来表示发生了错误。

这可能无法防范所有类型的任务失败(例如JVM崩溃),对此我不认为您有任何其他方法,除了可能在原始作业之后运行作业所使用的资源得到适当的清理。

+0

+1推荐! – DDW

0

使用作业类,如果作业完成,即使目录是在本地文件系统中,你绝对可以删除一些文件夹,使用文件系统

More on filesystems in hadoop