我可以看到在我的mapreduce作业中,reducer部分的输出是按键排序的。
因此,如果我将reducer的数量设置为10,则输出目录将包含10个文件,并且每个输出文件都有一个排序的数据。
我把它放在这里的原因是,即使所有的文件都有排序的数据,但这些文件本身没有排序。例如:在某些场景中,part-000*文件从0开始,以zzzz结束,假设我使用Text作为键。
我假设文件应该在文件中排序,即文件1应该有一个和最后一个文件部分-00009应该有ZZZZ或atleaset> a
假设我有所有字母均匀分布的键
有没有人能解释一下为什么会有这样的行为
您可以使用以下方法实现全局排序文件(这是您基本想要的):
- 在mapreduce中只使用一个reducer(坏主意!!)这会给一台机器带来太多的工作)
写入自定义分区。Partioner是mapreduce中划分键空间的类。默认分区器(Hashpartioner)将键空间平均划分为多个reducer。查看这个编写自定义分区程序的示例。
使用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,然后从排序表中插入覆盖本地表—将数据写入文件