MapReduce【自定义分区Partitioner】

news2024/11/18 22:49:39

实际开发中我们可能根据需求需要将MapReduce的运行结果生成多个不同的文件,比如上一个案例【MapReduce计算广州2022年每月最高温度】,我们需要将前半年和后半年的数据分开写到两个文件中。

默认分区

默认MapReduce只能写出一个文件:

 因为我们在提交job的时候未设置reduceTask的个数,所以默认reduceTask的个数为1,结果也就只能输出一个文件,下面是数据写入文件时,默认调用的HashPartitioner类的getPartition方法:

public int getPartition(K key, V value, int numReduceTasks) {
        return (key.hashCode() & 2147483647) % numReduceTasks;
    }

因为reduceTask数量为1,任何数1取余结果为0,所以文件只有一个且文件名位 "part-r-00000"

自定义分区

1.继承Partitioner类

像HashPartitioner类一样继承Partitioner类

2.指定泛型

因为分区出现在map方法之后,所以两个泛型参数分别为map方法输出的key和value的类型

3.继承getPartition方法

  • 继承后需要重写分区逻辑,也就是说如何根据输入的键或值来确定该行数据的分区。 
  • 设置自定义分区后,因为我们的输入格式是默认的TextInputFormat,所以每行数据都会通过getPartitioner方法来选择分区。
public class MyPartitioner extends Partitioner<Text, IntWritable> {

    @Override
    public int getPartition(Text text, IntWritable intWritable, int partitioner) {

        //text 是月份
        String month = text.toString();
        int month_num = Integer.parseInt(month);
        //注意:分区号必须从0开始!
        if (month_num<=6)   //前半年的数据放到分区0
            partitioner = 0;
        else                //后半年的数据放到分区1
            partitioner = 1;

        return partitioner;//返回分区号
    }

}

4.在job中设置分区

  • 我们不仅要指定分区的类型还要指定reduceTask的数量,因为我们最后是根据分区的数量来分配给不同的reduceTask去执行。

这里我们只需要增加下面的语句即可,其余部分代码不需要改动。

//绑定自定义分区
        job.setPartitionerClass(MyPartitioner.class);
        //设置reduceTask个数
        job.setNumReduceTasks(2);

 输出结果

注意点-reduceTask的数量

reduceTask数量 > 分区的数量

这种情况会造成CPU资源的浪费,因为会多开启 reduceTask ,它没有任务还空占大约1G内存。

 1< reduceTask数量< 分区的数量

会抛出异常,因为有多余的分区剩下来没有reduceTask拉取处理。

reduceTask数量 =1

自定义分区失效,按照默认的分区规则(HashPartitioner的getPartitioner方法)执行,仍然只生成一个结果文件。

分区号必须从0开始

向下面这段代码一样,共划分了5个分区(0~4),结果会有5个结果文件产生。

if (条件1)   
     partitioner = 0;    //分区0
else if(条件2)                
     partitioner = 1;    //分区1
else if(条件3)                
     partitioner = 2;    //分区2
else if(条件4)                
     partitioner = 3;    //分区3
else                 
     partitioner = 4;    //分区4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

文章目录 前言一、关于 【OceanBase 4.1】征文活动&#xff08;可跳过&#xff09;二、OceanBase 产品了解2.1 初识 OceanBase2.2 什么是 OceanBase2.3 OceanBase 相关链接2.4 OceanBase 与传统数据库对比有何特别之处2.5 OceanBase 相关概念以及术语2.5.1 OceanBase 基本概念2…

接口测试总结及其用例设计方法整理,希望可以帮到你

目录 接口测试的总结文档 第一部分&#xff1a; 第二部分&#xff1a; 接口测试用例设计 接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做…

ios中video标签兼容问题

案例 这是在实际开发中遇到的问题,产品给出的效果图如下: 其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下: 看到这里是不是很崩溃, 在PC端, 在安卓端…

RK3568平台开发系列讲解(Camera篇)快速了解RK Camera的使用

🚀返回专栏总目录 文章目录 一、MIPI CSI1.1 Full Mode特点1.2 Split Mode特点二、Full Mode配置2.1 配置sensor端2.2 csi2_dphy0相关配置2.3 isp相关配置三、Split Mode配置3.1 配置sensor端3.2 csi2_dphy1/csi2_dphy2相关配置3.3 isp相关配置四、软件相关目录

自然语言处理实战项目7-利用层次聚类方法做文本的排重,从大量的文本中找出相似文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目7-利用层次聚类方法做文本的排重&#xff0c;从大量的文本中找出相似文本。随着互联网技术的不断发展&#xff0c;越来越多的数据被广泛地应用在各个领域中。而文本数据是其中之一&#xff0c;…

ar在汽车维修行业的应用场景

由于AR增强现实技术的易用性&#xff0c;在汽车产业链中&#xff0c;已处处可见AR技术的踪影&#xff0c;像汽车设计AR远程协同&#xff0c;汽车装配AR远程指导&#xff0c;汽车维修AR远程协助等等&#xff0c;那么下面为详细介绍AR增强现实技术在汽车制造领域的应用。 环境/物…

实力在线 | 赛宁网安连续三年入选《中国网络安全市场全景图》

​​近日&#xff0c;国内专业安全机构数说安全正式发布了《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。此次全景图分类架构涵盖了产品、解决方案、应用场景、服务4个维度&#xff0c;覆盖了目前我国网络安全行业所有成熟的细分市场。 赛宁网安凭…

Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询

Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集成一下, 做个常规功能验证, 研究了下发现, 不同的下单途径, 有的需要登录(Session依赖), 有的需要验签(使用数字签名的微服务),…

用本地机做跳板使服务器连接外网【mac】

用自己的电脑做跳板使服务器连接外网 前提整体流程连接服务器配置服务器配置自己的电脑 前提 很多时候我们的服务器只能联内网&#xff0c;但是没法登外网&#xff0c;这样pip&#xff0c;conda 啥的都没法用&#xff0c;很麻烦。 一个简单的解决方法就是用自己的电脑作为跳板…

补充点【数据分析统计学知识点】

数据分析所需的统计学笔记 0.数据分析师拿到数据 第一利器&#xff1a;描述性统计信息 第二利器&#xff1a;对比分析法 第三利器&#xff1a;指标体系-要素拆解&#xff0c;维度拆解 第四利器&#xff1a;相关分析 第五利器&#xff1a;趋势预测 1.均值 2.中位数 3.众数…

基于Java+SpringBoot+vue的口腔管家平台设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

Hadoop 3.0.0的集群搭建和Hive 3.1.3的安装

Hi,朋友们&#xff0c;我们又见面了&#xff0c;这一次我给大家带来的是Hadoop集群搭建及Hive的安装。 说明一下&#xff0c;网上有很多的教程&#xff0c;为什么我还要水&#xff1f; 第一&#xff0c;大多数的安装都是很顺利的&#xff0c;没有疑难解答。 第二&#xff0c…

分布式项目08 redis的扩容,预备redis宕机的哨兵处理 和 最后集大成redis集群

01.redis扩容 由于redis的容量也是有限的&#xff0c;所以&#xff0c;就会有扩容的操作。也就好像内存中扩容一样。redis有分片这种说法&#xff0c;具体实现操作如下&#xff1a; 第一步&#xff1a;首先在/usr/local/src中去找到redis文件夹。cd /usr/local/src 而后进入re…

瑞吉外卖 - 菜品信息分页查询功能(17)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

开源大语言模型完整列表

Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 LLM 通常基于神经网络模型&#xff0c;使用大规模的语料库进行训练&#xff0c;比如使…

【Linux进阶之路】基本指令(下)

文章目录 一. 日志 date指令——查看日期基本语法1基本语法2cal指令——查看日历常见选项 二 .find——查找文件常用选项-name显示所有文件显示指定类型的文件 三.grep——行文本过滤工具语法常见的用法补充知识——APP与服务器的联系 四.打包压缩与解压解包zip与unzipzipunzip…

又一高速AD/DA数据采集卡问世,何不了解一下?

FMC190 子卡集成 2 通道 3Gsps 采样率&#xff0c;14 位 AD&#xff0c;2 通道12.8Gsps 16 位DA。板载时钟芯片 HMC7044&#xff0c;可以提供JESD204B所需要的各种时钟。具有同步/触发功能&#xff0c;模拟信号采用 SSMA 射频连接器输入和输出。板载时钟芯片为 HMC7044&#xf…

Unity UI -- (3)管理屏幕大小和锚点

在前面我们探索了一些基本的文本格式。我们需要考虑一个问题&#xff0c;这个文本在屏幕大小发生变化时该如何适应呢&#xff1f; 在Unity中&#xff0c;我们可以使用Canvas和Anchor Point&#xff08;锚点&#xff09;系统来确保UI元素总是出现在正确的位置&#xff0c;不管它…

Arduino ESP32的串口

Arduino的ESP32的三个串口 ESP32的三个串口 在Arduino的核心中有三个串口&#xff0c;分别是Serial&#xff0c;Serial1&#xff0c;和Serial2. 当然ESP32也可以使用软串口。但硬件串口更稳健&#xff08;我这样理解&#xff09;。但Serial1这个串口不能使用&#xff0c;因为…

腾讯云轻量应用服务器公网带宽速度如何?

腾讯云轻量应用服务器网速怎么样&#xff1f;轻量应用公网IP带宽速度与地域有关&#xff0c;中国大陆地域如北京、上海、广州等地域采用多线BGP网络&#xff0c;保障轻量应用服务器的速度&#xff0c;中国香港国际CN2高速网络。中国内地的地域大家是完全不用担心&#xff0c;大…