我是hadoop世界的新手,正在努力完成一项简单的任务。
有人能告诉我如何通过只使用Map reduce代码技术来获得单词计数示例的前n个值吗?
对于这个简单的任务,我不想使用任何hadoop命令。
您有两个明显的选项:
拥有两个MapReduce作业:
- WordCount:统计所有的单词(几乎就是这个例子)
- 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
这应该更快,因为您只对一小部分结果进行后处理。
这是我能想到的最快的方法,但可能不值得这么努力。