MR 计算时使用组排序器后哪些数据在一次reduce计算中的思考

本文围绕Hadoop MR流程中组排序器使用后的数据汇聚问题展开。先梳理了MR流程,包括split、Map计算、溢写、归并、shuffle等环节。经测试得出,自定义reduce方法的一组数据由组排序器决定,困惑源于设计map端排序器时考虑不明确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前一直理解为 同一组key汇聚到reduce计算,今天写了组排序器和map阶段排序器 并且key为对象 时:突然如果组排序器代表的排序逻辑所定义的相同key在一次reduce计算中,还是即使使用组排序器,还是以key的hashCode为界定呢?

首先梳理目前的已知MR流程:

首先Hadoop在使用定义好的split大小,使用fileSystem的seek()及getBlocklocations()来读取规定大小的数据,这个过程叫split.

split会被Hadoop的读取器(默认为行读取器)逐行读取数据,这里拿到的每行数据分别经过Map计算(我们自定义的逻辑),计算结果为K-V-P k-v代表键值对 p代表partitions,也就是对reduce个数的控制。

这些k-v-p数据会先放在一个内存缓冲区中(环形缓冲区,默认100M),当数据大小达到阈值0.8,开始溢写到磁盘形成小文件。当然在溢写前完成了排序逻辑(分区有序,分区内部数据有序)。当本节点数据全部读取完成此节点会有多个小文件,他们内部是有序的但是文件间无序,所以再进行过归并! 这个过程的排序规则通过排序器来完成。如果map输出的key为对象,实现compare来完成大小定义,当然自定义排序器可以改变它本身定义的排序逻辑。

多个map节点网络传输数据到对应的reducer 具体到哪个是由数据的P来界定。这个过程我们叫shufle.

一个reduce接收多个map的文件完毕,还要进行归并处理,合并成为1个或几个文件。这个过程要经过分组排序器,因为map端定义的排序逻辑对按照这个逻辑来完成对reduce端要汇聚的数据的界定,当我们再不改变数据排序的前提下,界定我们reduce方法想要汇聚的数据时(这些数据的排序还是有map端定义的排序器来完成的),这就是使用组排序器的时机。

组排序器界定的数据组内完成我们要计算的逻辑。整个MR就完成了。

以上是我脑海中的已知知识,但是实际解决问题是还是有事分辨不清在组排序器使用后 哪些数据到底是哪些数据汇聚为一组。很多时候下意识的以为还是原来的规则。所以写这篇博客。

经过手写一段测试demo计算后:

结论:经过自定义reduce方法的一组数据确实由组排序器决定。

造成这种困惑的原因:设计map端排序器时没有考虑明确,到时数据处理发生的意向外的效果,进而对这块知识产生了怀疑

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值