返回顶部
首页 > 资讯 > 后端开发 > Python >hadoop全面解读自定义分区
  • 137
分享到

hadoop全面解读自定义分区

2024-04-02 19:04:59 137人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

分区概念

分区这个词对很多同学来说并不陌生,比如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、获取job
        Configuration configuration = new Configuration();
        Job job = Job.getInstance(configuration);

        //2、设置jar路径
        job.setJarByClass(DemoJobDriver.class);

        //3、关联mapper 和 Reducer
        job.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 提交job
        boolean 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> {

    @Override
    public 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 自定义分区内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: hadoop全面解读自定义分区

本文链接: https://lsjlt.com/news/140100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • hadoop全面解读自定义分区
    分区概念 分区这个词对很多同学来说并不陌生,比如Java很多中间件中,像kafka的分区,mysql的分区表等,分区存在的意义在于将数据按照业务规则进行合理的划分,方便后续对各个分区...
    99+
    2024-04-02
  • hadoop如何自定义分区
    今天小编给大家分享一下hadoop如何自定义分区的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。分区概念分区这个词对很多同学来...
    99+
    2023-06-29
  • hadoop中mapreducez如何自定义分区
    这篇文章主要为大家展示了“hadoop中mapreducez如何自定义分区”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“hadoop中mapreducez如何自定义分区”这篇文章吧。packag...
    99+
    2023-06-02
  • webpack自定义loader全面详解
    目录什么是loaderloader类型如何指定loader类型如何禁用一些loader?开发自定义两个loader,并分别实现url-loader和file-loaderfile-l...
    99+
    2023-01-04
    webpack自定义loader webpack loader
  • 基于自定义Toast全面解析
    Toast一般用来显示一行文字,用法比较固定:Toast.makeText(Context context,String message,int duration);...
    99+
    2023-05-30
    自定义 toast st
  • 「 Hadoop」mapreduce对温度数据进行自定义排序、分组、分区等 【转载】
    原帖地址:http://www.ptbird.cn/mapreduce-tempreture.html 「 Hadoop」mapreduce对温度数据进行自定义排序、分组、分区等   一、需求说明 1、数据文件说明 hdfs...
    99+
    2017-04-10
    Hadoop」mapreduce对温度数据进行自定义排序 分组 分区等 【转载】
  • 怎么自定义JDBCRDD的分区
    这篇文章主要讲解了“怎么自定义JDBCRDD的分区”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么自定义JDBCRDD的分区”吧!1,JDBCRDD使用val data = new Jdb...
    99+
    2023-06-19
  • C语言自定义类型全面系统理解
    目录一、结构体1.结构体的声明局部结构体变量全局结构体变量2.特殊声明3.结构体的自引用4.结构体变量的初始化5.结构体内存对齐 6.修改默认对齐数7.结构体传参传址调用原因:二、位...
    99+
    2024-04-02
  • java自定义切面增强方式(关于自定义注解aop)
    目录java自定义切面增强切面、自定义注解的使用AOP简介AOP定义注解简介元素和组成元注解总结java自定义切面增强 写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面...
    99+
    2023-05-14
    java自定义切面增强 自定义注解aop java切面
  • ubuntu21.04系统怎么自定义分区安装?
    今天要在自己的一台笔记本电脑中安装最新的ubuntu21.04系统,但是这台电脑已经有其它操作系统以及文件,所以想选择个自定义的空闲的分区进行安装,这样就不用把文件拷贝出来了,该怎么实现呢?下面我们就拉看看详细的教程。 首先...
    99+
    2022-05-23
    ubuntu21.04 自定义分区 ubuntu安装
  • vue.js内部自定义指令与全局自定义指令的示例分析
    这篇文章将为大家详细讲解有关vue.js内部自定义指令与全局自定义指令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。directive这个单词是我们写自定义指令...
    99+
    2024-04-02
  • PHP数组定义方式全面解析
    PHP数组定义方式全面解析 PHP作为一种常用的服务器端脚本语言,数组是其非常重要的数据类型之一。在PHP中,数组可以存储多个值,并且可以通过索引或键来访问这些值。本文将全面解析PHP...
    99+
    2024-03-13
    php 数组 定义 键值对
  • C语言自定义类型全解析
    目录前言结构体类型结构体的声明结构体变量的定义与初始化结构体的自引用结构体的访问结构体的传参传结构体传地址结构体的内存对齐(强烈建议观看)位段位段的声明位段的内存管理位段的跨平台性 ...
    99+
    2024-04-02
  • 详解Flutter如何完全自定义TabBar
    目录前言实现过程完整代码总结前言 在App中TabBar形式交互是非常常见的,但是系统提供的的样式大多数又不能满足我们产品和UI的想法,这篇就记录下在Flutter中我在实现自定义T...
    99+
    2024-04-02
  • 使用swiper自定义分页点击跳转指定页面
    目录swiper自定义分页点击跳转指定页面swiper自定义分页器解决动态加载数据滑动失效的问题总结swiper自定义分页点击跳转指定页面 mySwiper.slideTo(inde...
    99+
    2023-05-15
    swiper分页 swiper自定义分页 swiper跳转指定页面
  • Android ViewDragHelper完全解析 自定义ViewGroup神器
    一、概述 在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和o...
    99+
    2022-06-06
    viewdraghelper Android
  • 自定义WPF分页控件的全过程记录
    一、分页控件功能说明# 实现如上图所示的分页控件,需要实现一下几个功能: 可以设置每页能够展示的最大列数(例如每页8列、每页16列等等)。 加载的数组总数量超过...
    99+
    2024-04-02
  • 怎么理解spark的自定义分区和排序及spark与jdbc
    这篇文章将为大家详细讲解有关怎么理解spark的自定义分区和排序及spark与jdbc,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。//自定义分区import org.apache...
    99+
    2023-06-02
  • asp.net中mvc4自定义404页面的示例分析
    这篇文章给大家分享的是有关asp.net中mvc4自定义404页面的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。定义404方法当然有很多种。不同的方法所展现的形式也不一...
    99+
    2024-04-02
  • React Native如何使用Modal自定义分享界面
    小编给大家分享一下React Native如何使用Modal自定义分享界面,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在很多App中都会涉及到分享,React Native提供了Moda...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作