hadoop 详解如何实现数据排序
前言
在hadoop的mapreduce中,提供了对于客户端的自定义排序的功能相关api
mapreduce排序
- 默认情况下,maptask 和reducetask均会对数据按照key进行排序
- 默认的排序按照字典序,且实现排序的方法是快排
mapreduce排序分类
1、部分排序
mapreduce根据输入记录的键值对数据集总体排序,确保输出的文件内部数据有序
2、全排序
最终的输出结果只有一个文件,且内部有序,实现方式是只设置一个reducetask,但是这种做法在处理的某个文件特别大的时候,效率会非常低,这也就丧失了mapreduce提供的并行处理任务的能力
3、辅助排序
在reduce端对key进行分组,比如说,在接收的key为bean对象的时候,想让一个或多个字段相同的key进入到同一个reduce方法时,可以采用分组排序
4、二次排序
在自定义排序中,compareto的判断条件为两个或者多个时即为二次排序
自定义排序案例
还记得在序列化一篇中,那个针对手机号的峰值流量和峰谷流量的例子吧,我们直接以该案例的输出结果为输入数据,对这个结果文件中按照总流量进行排序
期望输出数据的格式如:
1、自定义一个bean对象,实现writablecomparable 接口
实现该接口后,重写compareto方法,需要排序的字段逻辑就在compareto中编写
2、自定义mapper
设想一下,既然数据能排序,map阶段输出的key应该为自定义的可比较的对象,即为上面的这个bean,value为手机号
3、自定义reducer
reduce阶段的输出结果仍然以手机号为key,而value为排序后的自定义的bean
4、自定义driver类
运行上面的程序,观察输出结果,可以看到,总流量按照从大到小的顺序进行了排序
可以看到,最后的3行数据中,总流量相同,如果这时候又提出一个需求,当总流量相同时,再按照峰值流量进行排序,该怎么做呢?
其实只需要在自定义的bean中的compareto方法里面继续添加排序逻辑即可
分区内排序案例
业务需求,上面的案例中,我们进一步提出新的需求,针对不同的手机号最终写到不同的文件中,那么在上面的基础上,还需要结合自定义分区的逻辑
需要改造的包括2点:
- 添加一个自定义分区器,按照业务规则指定分区号
- 改造driver类,添加自定义分区器,设置mapreducetask任务个数
1、添加自定义分区
2、改造driver类
其他的逻辑和上面的保持一致即可
运行上面的程序,然后随机打开其中的两个文件检查下是否满足上面的需求,可以看到,文件最终输出到4个分区文件下,并且每个分区文件内的总流量也是按照从高到低的顺序
到此这篇关于hadoop 详解如何实现数据排序的文章就介绍到这了,更多相关hadoop 数据排序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
hadoop 详解如何实现数据排序
-
SQLserver:如何实现树状查询(同一个数据表)
-
[Vue]如何实现一个简单的表格数据筛选查找 (根据ElementUI表格展示)(数组筛选)
-
主数据库宕机怎么办?MHA高可用帮你实现主从服务器自动切换(详细操作与命令详解)
-
hadoop用Quorum Journal Manager(QJM)实现高可用 博客分类: 大数据hadoop
-
数据结构-二叉搜索树和二叉树排序算法(python实现)
-
MapReduce二次排序实现 博客分类: hadoop hadoop排序
-
如何实现多个servlet之间的跳转和传递数据
-
详解Java如何实现图像灰度化
-
Yii2实现跨mysql数据库关联查询排序功能代码