我在Hadoop 0.20中有一份工作需要对大文件进行操作,一次一个.(这是一个预处理步骤,将面向文件的数据转换为更清晰,基于行的格式,更适合MapReduce.)
我不介意我有多少输出文件,但每个Map的输出最多只能有一个输出文件,每个输出文件必须排序.
有没有办法说服Hadoop对每个作业的输出执行地图侧排序,而不使用Reducers,或任何其他方式来跳过缓慢的全局合并?
小智 2
进行全局排序的一种方法是使用自定义分区器并为您的减速器进行范围分区。为此,您必须知道映射器输出键的范围。您可以将键范围划分为 n 个桶,其中 n 是减速器的数量。根据键映射到的存储桶,映射器输出被路由到特定的减速器。
每个reducer的输出都是排序的。由于范围分区,所有减速器输出的集合都是全局排序的。您所要做的就是按照与文件名中的 5 位数字相同的顺序获取减速器输出文件。
需要注意的一件事是密钥分布的倾斜,这将导致集群中的减速器负载不均匀。如果您有分布信息(即密钥的直方图),则可以缓解此问题。然后你可以使你的桶长度不相等,并且每个桶持有大约相同数量的密钥。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
3474 次 |
| 最近记录: |