Hadoop Map Reduce代码的前N个值



我是hadoop世界的新手,正在努力完成一项简单的任务。

有人能告诉我如何通过只使用Map reduce代码技术来获得单词计数示例的前n个值吗?

对于这个简单的任务,我不想使用任何hadoop命令。

您有两个明显的选项:


拥有两个MapReduce作业:

  1. WordCount:统计所有的单词(几乎就是这个例子)
  2. TopN:一个MapReduce作业,它可以找到某个事物的前N(以下是一些示例:源代码、博客文章)

将WordCount的输出写入HDFS。然后,让TopN读取该输出。这被称为作业链,有很多方法可以解决这个问题:oozie、bash脚本、从驱动程序中启动两个作业等。

你需要两个作业的原因是你正在做两个聚合:一个是单词计数,第二个是topN。通常在MapReduce中,每个聚合都需要自己的MapReduce作业。


首先,让WordCount作业在数据上运行。然后,用一些重击将顶部的N拉出。

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20

sort -n -k2 -r表示"按列#2按降序进行数字排序"。head -n20占据前二十名。

这是WordCount的更好选择,因为WordCount可能只输出数千或数万行的数量级,而不需要MapReduce作业。记住,仅仅因为你有hadoop并不意味着你应该用hadoop解决所有的问题。


一个不明显的版本,很棘手,但上面两个的混合。。。

写一个WordCount MapReduce作业,但在Reducer中做一些类似于我之前向您展示的TopN MapReduce的作业。然后,让每个减速器仅输出该减速器的TopN结果。

所以,如果你在做前10个,每个减速器将输出10个结果。假设你有30个减速器,你会输出300个结果。

然后,使用bash:执行与选项2中相同的操作

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10

这应该更快,因为您只对一小部分结果进行后处理。

这是我能想到的最快的方法,但可能不值得这么努力。

相关内容

  • 没有找到相关文章

最新更新