mapreduce:自定义任务内存不足失败

mapreduce: customize task outofmemory failure

我有一个仅限地图的作业,每个文件作为一个任务运行。有时一个文件会导致任务内存不足类型的异常。

假设一个输入目录有 10 个文件。因此,该工作将有 10 个任务。现在假设 9 "good" 个文件会成功,1 个 "bad" 文件会导致内存不足异常。

理想情况下,我希望将一个 "bad" 文件移动到隔离目录。 9 "good" 个文件写入输出。作业成功,但日志中出现警告。

使用 mapreduce.reduce.failures.maxpercent 设置可以取得部分成功。

但是当容器因内存不足而失败时,如何将 "bad file" 复制到隔离区?

我在想覆盖 taskAbort 方法的自定义 FileOutputCommitter 会提供适当的钩子。

以前有其他人这样做过吗?

我试图在作业历史服务器 rest api 中找到答案,但不幸的是任务尝试不存储有关其输入路径的信息。

如果找不到更好的解决方案,可以这样做:

  1. 在 hdfs 上为您的作业创建一个特殊目录
  2. 在映射器设置方法中获取输入的拆分名称并将其存储在该目录内的特殊标记文件中
  3. 映射器成功完成后,在清理方法中删除此标记文件
  4. 作业完成后,检查目录并处理名称存在的坏文件