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