如何使用Hadoop对任意大量的数据进行排序?

时间:2011-12-16 17:10:16

标签: sorting hadoop mapreduce

我的问题与此帖Sorting large data using MapReduce/Hadoop有关。 我对任意设置进行排序的想法是:

  1. 我们有一个包含记录的大文件,比如10 ^ 9条记录。
  2. 该文件分为M个映射器。每个映射器对一个大小的分割进行排序,比如说使用QuickSort的10000个记录,并输出已排序的子序列。输出键的范围在1和R之间,其中R是减速器任务的数量(假设R = 4)。该值是已排序的子序列。
  3. 每个Reducer读取K个子序列并合并它们(迭代地从子序列中取出最小元素,直到子序列为空)。输出将写入文件。
  4. 然后完成以下处理:

    为了利用数据的位置,可以安排新的Reducer任务来合并前一个reducer任务生成的多个输出文件。因此,例如,如果K = 5,第一个reducer任务将生成大小为50000的文件,新的reducer任务将使用5个文件,每个50000个已排序的记录。将安排新的Reducer作业,直到只剩下一个文件,在这种情况下,大小为250.000.000(因为R = 4)。最后,将在另一台计算机上安排新的Reducer作业,以将文件合并为一个10 ^ 9文件

    我的问题:在Hadoop中是否可以安排执行Reducer作业,以便合并某些目录中的文件,直到只剩下1个文件?如果是,怎么样?

    另一种情况是在每个合并步骤之后安排MapReduce作业,例如,大小为50000的文件将通过在其他计算机上运行的reduce任务,然后在其他计算机上的大小为250.000的文件等并行合并。但这会产生大量的网络流量。在任何情况下,问题对于这种情况仍然有效 - 如何链接几个MapReduce作业,以便在仅输出1个结果文件后链接停止?

1 个答案:

答案 0 :(得分:1)

Hadoop排序是使用partitioner完成的。例如,请参阅source code

terasort benchmark