Hadoop源码分析(十)

2021SC@SDUSC

研究内容简略介绍

上周我们分析了迭代器类MarkableIterator,OutputCommitter,OutputFormat以及其子类,并对自定义格式输出有了进一步的了解。本此我们将继续分析,首先从org.apache.hadoop.mapreduce.Partitioner<KEY,VALUE>开始。

在这里插入图片描述

org.apache.hadoop.mapreduce.Partitioner<KEY,VALUE>源码分析

首先附上文件的源代码:

package org.apache.hadoop.mapreduce;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configurable;

@InterfaceAudience.Public
@InterfaceStability.Stable
public abstract class Partitioner<KEY, VALUE> {
   
  
  public abstract int getPartition(KEY key, VALUE value, int numPartitions);
  
}

在这里插入图片描述
官方给出了对Partitioner的解释,即Partitioner控制中间映射输出的键的分区。密钥(或密钥的子集)用于派生分区,通常通过散列函数。分区总数与作业的reduce任务数相同。因此,这控制m将中间键(以及记录)发送到哪些减少任务以进行减少。
Partitioner只有在有多个reducer时才会创建A。如果需要 Partitioner 类获取 Job 的配置对象,需要先实现该Configurable接口。

经过查询相关文档,我了解到在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,比如按照省份划分的话,需要把同一省份的数据放到一个文件中;按照性别划分的话,需要把同一性别的数据放到一个文件中。我们知道最终的输出数据是来自于Reducer任务。那么,如果要得到多个文件,意味着有同样数量的Reducer任务在运行。Reducer任务的数据来自于Mapper任务,也就说Mapper任务要划分数据,对于不同的数据分配给不同的Reducer任务运行。Mapper任务划分数据的过程就称作Partition。负责实现划分数据的类称作Partitioner。

可以看到,Partitioner下只有一个函数getPartition()。其中
key - 要分区的key值
value - 输入值
numPartitions - 分区总数

该函数给定分区总数,即作业的缩减任务数,获取给定键(因此记录)的分区号。通常是键的全部或子集上的散列函数。

子类HashPartitioner源码分析

Partitioner下有许多子类,包括BinaryPartitioner, HashPartitioner, KeyFieldBasedPartitioner, RehashPartitioner, TotalOrderPartitioner。

我们以其中的子类HashPartitioner的源码作进一步的分析:

package org.apache.hadoop.mapreduce.lib.partition;
 
import org.apache.hadoop.mapreduce.Partitioner;
 
/** Partition keys by their {@link Object#hashCode()}. */
public class HashPartitioner<K, V> extends Partitioner<K, V> {
   
 
  /** Use {@link Object#hashCode()} to partition. */
  public i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值