hadoop 自定义分区
分区概念
分区这个词对很多同学来说并不陌生,比如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分区算法计算结果并输出到不同分区对应的文件中去
自定义分区步骤
- 自定义类继承Partitioner
- 重写getPartition方法,并在此方法中根据业务规则控制不同的数据进入到不同分区
- 在Job的驱动类中,设置自定义的Partitioner类
- 自定义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 自定义分区相关推荐
- hadoop 自定义OutputFormat
前言 在某些业务场景下,需要对原始的数据进行合理的分类输出,减少后续的程序处理数据带来的麻烦,其实这也属于ETL中的一种,比如,我们收集到了一份原始的日志,主体字段为区域编码,需要根据这个编码将这份日 ...
- Spark自定义分区(Partitioner)
我们都知道Spark内部提供了HashPartitioner和RangePartitioner两种分区策略(这两种分区的代码解析可以参见:<Spark分区器HashPartitioner和Ran ...
- Hadoop MR 分区(partition)和全排序(WritableComparable)
一.概念 1.分区: Hadoop默认分区是根据key的hashCode对ReduceTask个数取模得到的,用户无法控制哪个key存储到哪个分区.想要控制哪个key存储到哪个分区,需要自定义类继承P ...
- Spark数据分区(partitionBy分区、partitioner获取分区方式、自定义分区)
数据分区 partitionBy分区 在分布式程序中,通信的代价是很大的,因此控制数据分布以获得最少的网络传输可以极大地提升整体性能.和单节点的程序需要为记录集合选择合适的数据结构一样,Spark 程 ...
- Hive自定义分区器流程
Hive自定义分区器流程 1. 环境说明 当前环境采用Hadoop3.1.3以及Hive3.1.2版本! 2. 自定义类 自定义类实现org.apache.hadoop.mapred.Partitio ...
- hive自定义分区器
Hive自定义分区器流程 1.自定义类 实现org.apache.hadoop.mapred.Partitioner(必须为这个,Hive中使用的是老的API)接口 package com.ailib ...
- kafka模拟生产-消费者以及自定义分区
2019独角兽企业重金招聘Python工程师标准>>> 基本概念 kafka中的重要角色 broker:一台kafka服务器就是一个broker,一个集群可有多个broker,一 ...
- java kafka 设置分区_Java kafka如何实现自定义分区类和拦截器
Java kafka如何实现自定义分区类和拦截器 2.producer配置文件指定,具体的分区类 // 具体的分区类 props.put(ProducerConfig.PARTITIONER_CLAS ...
- 07_clickhouse、自定义分区及底层存储合并机制、自定义分区键、分区目录的命名规则、分区目录的合并过程、分区目录的合并过程、分区表达式指定、分区案例
4.自定义分区及底层存储合并机制 4.1.自定义分区键 4.2.分区目录的命名规则 4.3.分区目录的合并过程 4.4.分区目录的合并过程 4.5.分区表达式指定 4.6.分区案例 4.自定义分区及底 ...
最新文章
- ios php 序列化,PHP常见的序列化与反序列化操作实例分析
- 【技术杂谈】RPC和RESTful API入门篇
- Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
- Java集合框架:LinkedList
- LeetCode 1806. 还原排列的最少操作步数(模拟)
- 使用feed_dict不一定要用占位符
- 《隐私计算》重 磅发布,全面、系统论述数据要素安全流通价值
- win7鼠标指针主题包_2020 鼠标指针还不换一换?
- 云计算最终比拼的是什么?
- 银行会计凭证粗略整理
- V2X协议栈介绍及说明(含框图)
- HBuilderX - 高效极客技巧
- 飞控中的IIR二阶滤波器
- 影响Google Adsense广告单价高低的因素分析获取更高的收入
- 树和二叉树的基本概念及性质
- 手把手教你用jQuery Mobile做相册
- 自制蹭网工具(全套-修改电脑MAC地址、IP、获取局域网内别人的MAC和IP)
- 【哈夫曼树】创建哈夫曼树
- MySQL事务原理详解,一篇文章让你搞懂
- ltrim用法(通俗易懂版)
热门文章
- 北京开源人linux运维实战
- 揭秘-选择迅捷PDF转Word转换器的原因
- 北大青鸟广州天河中心C#学习笔记一--C#中的参数传递
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...
- Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg...
- 如何重新定义云数据中心的资源利用率
- 分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用
- MySQL-回表查询与索引覆盖
- Javaweb之session创建销毁问题
- ​insert带来的TiDB集群性能瓶颈排障