MapReduce默认分区方式是什么,以及分区的注意事项

MR的默认分区是哈希分区,就是key的哈希值
在这里插入图片描述
上面这个图片就是源码,我们自定义分区的时候也是继承上面的类或者它的超类,指的一提的是MR的默认分区数也就是numReduceTasks的值是1,所以导致了,默认分区数时数据分区只有一个,而且默认的时候reduceTask也只有一个,因为MR中有多少个分区就有多少个reduceTask

也就构成shuffle按key分组,传到reduce时reduce按key拉取自己要处理的数据,然后做一次归并,之后按组处理数据的形式

在工作中除非必要,否则一般是不随意改动分区方式的,因为在生产环境中执行任务的时候,除了默认的map数等于切片数,以及等于分区数之外,还有着机架感知,就是为了防止不必要的网络io,接收到命令运行任务的那个datanode会以就近原则,拉取离自己最近的那一份切片,而这一份切片可能是原原本切片的备份切片,也就是备份的数据块,而你一旦改了自己的分区方式,那么在原来拉过来就用的基础上,可能会由于这个数据是其他分区的,如果分区之间在同一个datanode上换好,怕的就是不在一个datanode上,那就还要消耗网络io去传递数据,甚至有的时候某一个分区中的数据过大,会因为所有map结束之后才会启动reduce,导致任务的等待超时而失败

当然我只是说自定义分区,说的不是自定义分组,因为对于分组来说,哪怕不在一个datanode上,不同的datanode也不会有数据的传输,而是在各种的continue中执行者同样的操作,这也是任务运行之后,发现同组数据有时却不在一个分区文件中的原因,但是也不能吓分组,因为一个组数据太大,也会发生和分区过大时一样的任务超时失败的结果

至于如何自定义分区,请查看我其他的博文

猜你喜欢

转载自blog.csdn.net/dudadudadd/article/details/114157135
今日推荐