Hadoop Map减少代码的前N个值

时间:2013-12-14 12:21:38

标签: hadoop mapreduce

我在hadoop世界中非常新,并且努力完成一项简单的任务。

任何人都可以通过仅使用Map reduce代码技术告诉我如何获得字数计数的前n个值?

我不想在这个简单的任务中使用任何hadoop命令。

1 个答案:

答案 0 :(得分:20)

您有两个明显的选择:


有两个MapReduce作业:

  1. WordCount:计算所有单词(几乎就是这个例子)
  2. TopN:找到某些内容的前N个的MapReduce作业(以下是一些示例:source codeblog post
  3. 让WordCount的输出写入HDFS。然后,让TopN读取该输出。这称为作业链,有许多方法可以解决这个问题:oozie,bash脚本,从你的驱动程序中解雇两个作业等。

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


    首先,让您的WordCount作业运行数据。然后,使用一些bash将顶部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作业。然后,让每个reducer只输出该reducer的TopN结果。

    所以,如果你进入前10名,每个减速器将输出10个结果。假设您有30个减速器,您将输出300个结果。

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

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

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

    这是我能想到的最快的方式,但这可能不值得付出努力。