分区概念

分区这个词对很多同学来说并不陌生,比如Java很多中间件中,像kafka的分区,mysql的分区表等,分区存在的意义在于将数据按照业务规则进行合理的划分,方便后续对各个分区数据高效处理

Hadoop分区

hadoop中的分区,是把不同数据输出到不同reduceTask ,最终到输出不同文件中

hadoop 默认分区规则

  • hash分区
  • 按照key的hashCode % reduceTask 数量 = 分区号
  • 默认reduceTask 数量为1,当然也可以在driver 端设置

以下是Partition 类中摘取出来的源码,还是很容易懂的

hash分区代码演示

下面是wordcount案例中的driver部分的代码,默认情况下我们不做任何设置,最终输出一个统计单词个数的txt文件,如果我们在这段代码中添加这样一行

再次运行下面的程序后,会出现什么结果呢?

public class DemoJobDriver {public static void main(String[] args) throws Exception {//1、获取jobConfiguration configuration = new Configuration();Job job = Job.getInstance(configuration);//2、设置jar路径job.setJarByClass(DemoJobDriver.class);//3、关联mapper 和 Reducerjob.setMapperClass(DemoMapper.class);job.setReducerClass(DemoReducer.class);//4、设置 map输出的 key/val 的类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);//5、设置最终输出的key / val 类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//6、设置最终的输出路径String inputPath = "F:\\网盘\\csv\\hello.txt";String outPath = "F:\\网盘\\csv\\wordcount\\hello_result.txt";//设置输出文件为2个job.setNumReduceTasks(2);FileInputFormat.setInputPaths(job,new Path(inputPath));FileOutputFormat.setOutputPath(job,new Path(outPath));// 7 提交jobboolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}}


可以看到,最终输出了2个统计结果文件,每个文件中的内容有所不同,这就是默认情况下,当reducer个数设置为多个时,会按照hash分区算法计算结果并输出到不同分区对应的文件中去

自定义分区步骤

  1. 自定义类继承Partitioner
  2. 重写getPartition方法,并在此方法中根据业务规则控制不同的数据进入到不同分区
  3. 在Job的驱动类中,设置自定义的Partitioner类
  4. 自定义Partition后,要根据自定义的Partition逻辑设置相应数量的ReduceTask

业务需求

将下面文件中 的人物名称按照姓氏,“马”姓的放入第一个分区,“李”姓的放入第二个分区,其他的放到其他第三个分区中

自定义分区

import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.io.Text;public class MyPartioner extends Partitioner<Text, IntWritable> {@Overridepublic int getPartition(Text text, IntWritable intWritable, int partion) {String key = text.toString();if(StringUtils.isNotEmpty(key.trim())){if(key.startsWith("马")){partion = 0;}else if(key.startsWith("李")){partion = 1;}else {partion = 2;}}return partion;}
}

将自定义分区关联到Driver类中,注意这里的ReduceTasks个数和自定义的分区数量保持一致

job.setNumReduceTasks(3);
job.setPartitionerClass(MyPartioner.class);

下面运行Driver类,观察最终的输出结果,也是按照预期,将不同的姓氏数据输出到了不同的文件中


关于自定义分区的总结

  • 如果ReduceTask的数量 > 自定义partion中的分区数量,则会多产生几个空的输出文件
  • 如果 1 < ReduceTask < 自定义partion中的分区数量,有一部分的数据处理过程中无法找到相应的分区文件存储,会抛异常
  • 如果ReduceTask = 1 ,则不管自定义的partion中分区数量为多少个,最终结果都只会交给这一个ReduceTask 处理,最终只会产生一个结果文件
  • 分区号必须从0开始,逐一累加

hadoop 自定义分区相关推荐

  1. hadoop 自定义OutputFormat

    前言 在某些业务场景下,需要对原始的数据进行合理的分类输出,减少后续的程序处理数据带来的麻烦,其实这也属于ETL中的一种,比如,我们收集到了一份原始的日志,主体字段为区域编码,需要根据这个编码将这份日 ...

  2. Spark自定义分区(Partitioner)

    我们都知道Spark内部提供了HashPartitioner和RangePartitioner两种分区策略(这两种分区的代码解析可以参见:<Spark分区器HashPartitioner和Ran ...

  3. Hadoop MR 分区(partition)和全排序(WritableComparable)

    一.概念 1.分区: Hadoop默认分区是根据key的hashCode对ReduceTask个数取模得到的,用户无法控制哪个key存储到哪个分区.想要控制哪个key存储到哪个分区,需要自定义类继承P ...

  4. Spark数据分区(partitionBy分区、partitioner获取分区方式、自定义分区)

    数据分区 partitionBy分区 在分布式程序中,通信的代价是很大的,因此控制数据分布以获得最少的网络传输可以极大地提升整体性能.和单节点的程序需要为记录集合选择合适的数据结构一样,Spark 程 ...

  5. Hive自定义分区器流程

    Hive自定义分区器流程 1. 环境说明 当前环境采用Hadoop3.1.3以及Hive3.1.2版本! 2. 自定义类 自定义类实现org.apache.hadoop.mapred.Partitio ...

  6. hive自定义分区器

    Hive自定义分区器流程 1.自定义类 实现org.apache.hadoop.mapred.Partitioner(必须为这个,Hive中使用的是老的API)接口 package com.ailib ...

  7. kafka模拟生产-消费者以及自定义分区

    2019独角兽企业重金招聘Python工程师标准>>> 基本概念 kafka中的重要角色   broker:一台kafka服务器就是一个broker,一个集群可有多个broker,一 ...

  8. java kafka 设置分区_Java kafka如何实现自定义分区类和拦截器

    Java kafka如何实现自定义分区类和拦截器 2.producer配置文件指定,具体的分区类 // 具体的分区类 props.put(ProducerConfig.PARTITIONER_CLAS ...

  9. 07_clickhouse、自定义分区及底层存储合并机制、自定义分区键、分区目录的命名规则、分区目录的合并过程、分区目录的合并过程、分区表达式指定、分区案例

    4.自定义分区及底层存储合并机制 4.1.自定义分区键 4.2.分区目录的命名规则 4.3.分区目录的合并过程 4.4.分区目录的合并过程 4.5.分区表达式指定 4.6.分区案例 4.自定义分区及底 ...

最新文章

  1. ios php 序列化,PHP常见的序列化与反序列化操作实例分析
  2. 【技术杂谈】RPC和RESTful API入门篇
  3. Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
  4. Java集合框架:LinkedList
  5. LeetCode 1806. 还原排列的最少操作步数(模拟)
  6. 使用feed_dict不一定要用占位符
  7. 《隐私计算》重 磅发布,全面、系统论述数据要素安全流通价值
  8. win7鼠标指针主题包_2020 鼠标指针还不换一换?
  9. 云计算最终比拼的是什么?
  10. 银行会计凭证粗略整理
  11. V2X协议栈介绍及说明(含框图)
  12. HBuilderX - 高效极客技巧
  13. 飞控中的IIR二阶滤波器
  14. 影响Google Adsense广告单价高低的因素分析获取更高的收入
  15. 树和二叉树的基本概念及性质
  16. 手把手教你用jQuery Mobile做相册
  17. 自制蹭网工具(全套-修改电脑MAC地址、IP、获取局域网内别人的MAC和IP)
  18. 【哈夫曼树】创建哈夫曼树
  19. MySQL事务原理详解,一篇文章让你搞懂
  20. ltrim用法(通俗易懂版)

热门文章

  1. 北京开源人linux运维实战
  2. 揭秘-选择迅捷PDF转Word转换器的原因
  3. 北大青鸟广州天河中心C#学习笔记一--C#中的参数传递
  4. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...
  5. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg...
  6. 如何重新定义云数据中心的资源利用率
  7. 分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用
  8. MySQL-回表查询与索引覆盖
  9. Javaweb之session创建销毁问题
  10. ​insert带来的TiDB集群性能瓶颈排障