分区和分组的区别:
1、分区:
一个分区就是一个任务;当数据量大,单个reducetask处理不了时,需要多个reducetask同时处理全部数据;
partition调用HashPartitioner组件,获得区号;
HashPartitioner.getPartition(nk,nv){
nk.hashcode%numberReduceTasks;
}
分区能够保证同一个逻辑下的K到达同一个reducetask中,按照K进行全局聚合、排序、分组;保证处理全部数据;保证处理的数据不重复。
2、分组:
分组调用GroupingComparator组件中的CompareTo(preK,postK)方法,将相同K的分到一组,放入同一迭代器中进行聚合。
分组是保证聚合逻辑的正确性,一组数据执行一次。
任务切片和物理切块
1、物理切块:
物理切块是HDFS对数据进行存储时,会存储3个副本到从节点上进行分布式存储,保证存储数据的高可用性;需要对元数据进行物理切块,每个block块默认128M。
2、逻辑切片:
split是一种逻辑切片,是MapReduce里的概念,用对象来封装每一个切片的信息,是在数据处理前进行任务分发时对
任务切片逻辑确定maptask数量,每一个输入文件至少有一个切片;每一个切片运行一个maptask。
3、物理切块和逻辑切片大小:
split的大小在默认的情况下和HDFS的block切块大小一致,为了是MapReduce处理的时候减少由于split和block之间大小不一致导致的网络传输下载。