MapReduce作业输出排序顺序



我可以看到在我的mapreduce作业中,reducer部分的输出是按键排序的。

因此,如果我将reducer的数量设置为10,则输出目录将包含10个文件,并且每个输出文件都有一个排序的数据。

我把它放在这里的原因是,即使所有的文件都有排序的数据,但这些文件本身没有排序。例如:在某些场景中,part-000*文件从0开始,以zzzz结束,假设我使用Text作为键。

我假设文件应该在文件中排序,即文件1应该有一个和最后一个文件部分-00009应该有ZZZZ或atleaset> a

假设我有所有字母均匀分布的键

有没有人能解释一下为什么会有这样的行为

您可以使用以下方法实现全局排序文件(这是您基本想要的):

    在mapreduce中只使用一个reducer(坏主意!!)这会给一台机器带来太多的工作)
  1. 写入自定义分区。Partioner是mapreduce中划分键空间的类。默认分区器(Hashpartioner)将键空间平均划分为多个reducer。查看这个编写自定义分区程序的示例。

  2. 使用Hadoop Pig/Hive进行排序

总排序

来自特定key的所有键值对将到达特定的reducer。这将通过Mapper级别的partitioner来实现。Mapper级别的组合器将充当Semi Reducer,并将特定密钥的值发送给Reducer。HashPartitioner是决定reducer数量的最佳分区器。

reducer的输出将是一个单独的文件,所有的输出将根据键进行排序。

二级分类

用于定义映射输出键的排序方式。它在Mapper级别上工作。在这种情况下,我们将能够控制值和键的顺序。也就是说,可以对两个或多个字段值进行排序。

查看总订单排序&二级分类

Q :all the files have sorted data but these files itself are not sorted..

Ans: Custom Hashpartitioner默认用于分区中间输出(来自mapper)。

,

If the intermediate values are 3,4,5,6,7,8,9,10,11
Then the data will be partitioned into (lets say) Reducer: 
R1{7,4,10}
R2{5,11,8}
R3{9,6,3}

那么现在平面文件就有

Part-00000 {4,,7,11}
Part-00001 {5,8,11}
Part-00002 {3,6,9}

如果您正在寻找按值排序:这里是ans

Hive order by使用单个reducer,因此您可以使用distribute by/sort by,然后从排序表中插入覆盖本地表—将数据写入文件

相关内容

  • 没有找到相关文章

最新更新