我正在尝试减少数据流中 mapreduce 作业的延迟,并且我想使用 hdfs-api 连续跟踪 reducer part-xxxx 文件的输出,而不是在作业完成后读取它。但我想知道这对于 hadoop 工作是否安全?
1 回答
当您使用FileOutputFormat
基于输出格式(文本、序列文件等)时,它们会使用一个公共的公共文件,该公共文件FileOutputCommitter
负责在减速器输出成功/失败等时提交或中止它。
在幕后,当你的 reducer 正在写入输出时,它会被写入你指定的 HDFS 输出目录的 _temporary 子目录。
当 reducer 完成时,作业跟踪器将表示该 reducer 尝试的一个特定实例(请记住,对于推测性执行,reducer 任务尝试可能会运行 1 次或多次)作为最终输出,并向输出提交者发出信号以提交该版本的reducer 输出(其他尝试将被中止)。
当输出提交者提交尝试输出时,它只是将 part-r-xxxxx 文件从尝试临时目录移动到指定的输出目录。
因此,考虑到这一点,当您在输出目录中看到 part-r-* 文件时,这些文件已经完全写入并且可以安全跟踪。因此,从这个意义上说,您可以在处理减速器输出时获得跳跃(假设您有 10K 减速器在 1000 个减速器插槽集群上运行) - 但您不能安排另一个映射/减少作业来处理此输出,因为只有减速器输出具有finished 将在下一个 map reduce 作业中使用(提交作业时,它只会考虑当前可用的文件作为输入,不会继续扫描作业提交后出现的新文件)。
您还应该考虑您的工作实际上可能在最后几个减速器中失败 - 在这种情况下,您是否仍然希望急切地处理那些在失败之前已完成的减速器输出,或者您只想在整个工作完成时处理(这对大多数工作来说更有意义)。