我想知道: 如果两次提交相同的作业,hadoop mapreduce会重新处理整个数据集吗? 例如:单词计数示例计算输入文件夹中每个文件中每个单词的出现次数。 如果我要将文件添加到该文件夹,并重新运行word count mapreduce作业,是否会重新读取,重新编写和重新缩小初始文件?
如果是这样,有没有办法配置hadoop来处理新文件并将其添加到以前mapreduce运行的“摘要”中。
任何想法/帮助都将受到赞赏。
答案 0 :(得分:3)
如果我要将文件添加到该文件夹,并重新运行字数map mapuce作业,是否会重新读取,重新编码和重新缩小初始文件?
Hadoop将在再次运行时重新处理整个数据。成功完成作业后,将删除映射器的输出和临时数据。
如果是这样,有没有办法配置hadoop来处理新文件并将其添加到以前mapreduce运行的“摘要”中。
Hadoop as-is不支持方案,但您可以编写一个自定义的InputFormat来检查未处理的或新的文件,以及一个cutom OutputFormat,它将数据添加到上一次运行的摘要中。或者,一旦作业运行,可以将要处理的新文件放在不同的输入文件夹中,让Job只处理新文件夹中的文件。
在创建自定义输入/输出格式时检查此article。
我不确定具体要求,但您也可以考虑处理数据流的框架,例如HStreaming,S4,Twitter Storm等。
答案 1 :(得分:0)
我同意Praveen所说的一切。我将提供一种特定的方式,我个人在我的群集上处理它。
当我将文件推送到HDFS时,我会根据系统时钟将它们放入文件夹中。
$ hadoop fs -put thisfile1249.txt /tmp/
$ hadoop fs -mv /tmp/thisfile1249.txt `date "+/data/%Y/%m/%d/%H/%M/"`
让我们看看路径是什么样的:
$ echo `date "+/data/%Y/%m/%d/%H/%M/"`
/data/2011/12/27/09/49/
这意味着当文件进入时,它们将按分钟进入文件夹。由于时间单调增加,当您在文件夹上运行时,您知道您不必再返回并再次运行该文件夹。如果您想每小时运行一个作业,您只需将输入路径指向/data/2011/12/27/08
即可。每日将是/data/2011/12/26
等。
答案 2 :(得分:0)
Hadoop本身并不像其他人提到的那样支持部分运行数据。您可以获得所需的功能如果您使用HBase作为map-reduce的源并使用适当的过滤器传递扫描(例如,通过大于上次运行的时间戳)