`

Partitioner, SortComparator and GroupingComparator in Hadoop

阅读更多

来源:http://roserouge.iteye.com/blog/746391

 

hadoop 0.20.2 api里面,作业被重新定义到了类 org.apache.hadoop.mapreduce.Job。

它有3个特别的方法:

job.setPartitionerClass(Partitioner p);

job.setSortComparatorClass(RawComparator c);
job.setGroupingComparatorClass(RawComparator c);

 

数据在被map处理过之后,会根据 Partitioner 定义的规则,把中间结果分发到特定的reduce。

Partitioner<Key, Value> 包含一个方法:public int getPartition(Key k, Value v, int parts)

Java代码收藏代码
  1. publicstaticclassPextendsPartitioner<IdWithTimestamp,Value>{
  2. @Override
  3. publicintgetPartition(IdWithTimestampk,Valuev,intparts){
  4. inthash=k.getId().hashCode();
  5. return(hash&Integer.MAX_VALUE)%parts;
  6. }
  7. }

 

接下来,可以做一些控制,使得不同 Key的中间数据,能够被分发到同一个reduce 处理,setGroupingComparatorClass提供分组规则。

例如,key可能是[id, timestamp],这样可以使相同的id(String)能按时间戳(long)排序,现在拆出包含在key里的相同id,分到相同的组。

Java代码收藏代码
  1. publicclassIdComparatorextendsTextComparator{
  2. @Override
  3. publicintcompare(IdWithTimestampo1,IdWithTimestampo2){
  4. returno1.getId().compareTo(o2.getId());
  5. }
  6. }

 

然后,中间数据在被reduce处理之前,会先被集中排序,setSortComparatorClass提供排序规则。

Java代码收藏代码
  1. publicclassTimestampComparatorextendsTextComparator{
  2. @Override
  3. publicintcompare(IdWithTimestampo1,IdWithTimestampo2){
  4. returno1.getTimestamp()-o2.getTimestamp();
  5. }
  6. }

 

如果不提供这些东西,默认使用的是 Key类型的 compareTo方法,而不是 hashCode和 equals。

可以自定义 WritableComparable类型,提供优化比较方法,以提高执行效率。。。字节比较,那是个挺麻烦的事情,我都是很偷懒地一直用Text,拼接、拆分字符串做比较。

 

Partitioner,SortComparator 和 GroupingComparator 配合即可实现某些对顺序有要求的计算。如果数据集很大的话,可能还需要控制map对输入的分割

Java代码收藏代码
  1. publicclassNoSplitInputFormatextendsTextInputFormat{
  2. @Override
  3. protectedbooleanisSplitable(JobContextcontext,Pathfile){
  4. returnfalse;
  5. }
  6. }

 

排序 + 计算 两个任务,不等于一个完整任务里的 按顺序计算。

 

实践证明,使用外部的RawComparator 更具灵活性,可以提供不同的排序和分组策略。

 

 

附例子程序,测试数据,测试结果

 

Join的时候也用得着它们

 

enjoy it!

 


 

分享到:
评论

相关推荐

    Hadoop 自定义 Partitioner JAR

    Hadoop 自定义 Partitioner 实现

    Hadoop 自定义 Partitioner 源代码

    其中,Partitioner 是 Hadoop MapReduce 框架中的关键组件,它负责决定 map 函数产生的中间键值对(key-value pairs)应被哪些 reduce task 处理。自定义 Partitioner 允许用户根据业务需求定制键的分发策略,从而...

    Hadoop 自定义 Partitioner 实现

    Hadoop 自定义 Partitioner 实现

    Hadoop权威指南中文版(第二版)+Hadoop in Action

    《Hadoop权威指南中文版(第二版)》与《Hadoop in Action》及《Pro Hadoop》这三本书是深入理解和掌握Hadoop生态系统的关键资源。Hadoop作为一个分布式计算框架,其核心是解决大规模数据处理的问题,它允许在廉价...

    Partitioner.zip

    而"Partitioner"在Hadoop MapReduce框架中扮演着至关重要的角色。这个名为"Partitioner.zip"的压缩包很可能包含了关于Hadoop MapReduce Partitioner的相关资料或实现代码。 Partitioner在Hadoop MapReduce的工作...

    Hadoop - Hadoop in Action

    ### Hadoop - Hadoop in Action #### 知识点概览 1. **Hadoop作为分布式编程框架的介绍** 2. **Hadoop集群的基本硬件组件** 3. **Hadoop的安装与配置** 4. **MapReduce框架的基础知识** 5. **编写与运行基本的...

    Hadoop的分割程序的例子。程序显示我们如何在Hadoop的MapReduce程序使用一个分区.zip

    在描述中提到的“如何在Hadoop的MapReduce程序使用一个分区”意味着我们要了解如何在Java代码中实现自定义的Partitioner类。下面是一个基本的步骤: 1. **创建自定义Partitioner**: 首先,你需要创建一个新的Java...

    Hadoop - Hadoop Streaming

    $ hadoop jar hadoop-streaming.jar -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner -mapper mymapper -reducer myreducer -input input -output output ``` 这里 `org.apache.hadoop.mapred...

    实战hadoop中的源码

    7. **扩展性与插件开发**:学习如何为Hadoop开发自定义InputFormat、OutputFormat、Partitioner、Combiner等组件。 8. **实战项目**:结合实际案例,运用所学知识解决大数据处理问题,如日志分析、推荐系统等。 ...

    hadoop2.7.7src包

    同时,MapReduce的编程模型,如Mapper、Reducer、Partitioner、Combiner等,都在这个版本的源码中体现。 3. **YARN**:YARN是Hadoop 2.x引入的重要变化,它将资源管理和任务调度从MapReduce中分离出来,使得Hadoop...

    hadoop 文档:Hadoop开发者下载

    5. **MapReduce编程**:理解MapReduce的工作流程,如何编写Mapper和Reducer类,以及Partitioner、Combiner的概念。Map阶段对数据进行切分和处理,Reduce阶段进行聚合和结果生成。 6. **YARN(Yet Another Resource ...

    hadoop早期版本

    这个版本可能还不包含后来的优化,如Combiner和Partitioner等。 四、Hadoop配置与管理 在早期版本中,Hadoop的配置相对简单,但依然需要理解诸如`core-site.xml`, `hdfs-site.xml`, `mapred-site.xml`等配置文件。...

    Hadoop-0.20.1+API

    Hadoop-0.20.1+API是一个关于Hadoop早期版本(0.20.1)的API参考文档,以CHM(Compiled Help Manual)格式呈现,适用于那些需要深入理解Hadoop框架以及其编程接口的开发者和系统管理员。CHM文件是一种微软编译的帮助...

    hadoop-3.1.3.tar.gz编译后的源码包

    3. **hadoop-mapreduce-client**: 提供了MapReduce编程接口,包括JobClient、Mapper、Reducer和Partitioner等类。 4. **hadoop-yarn**: YARN(Yet Another Resource Negotiator)是Hadoop的资源管理系统,负责集群...

Global site tag (gtag.js) - Google Analytics