MapReduce切片(Split)和分区(Partitioner)

MapReduce Input Split(输入分/切片)详解 看了很多博客,感觉没有一个说的很清楚,所以我来整理一下。 Hadoop 2.x默认的block大小是128MB,Hadoop 1.x默认的block大小是64MB,可以在hdfs-site.xml中设置dfs.block.size,注意单位是byte。 分片大小范围可以在mapred-site.xml中设置,mapred.min.split.size mapred.max.split.size,minSplitSize大小默认为1B,maxSplitSize大小默认为Long.MAX_VALUE = 92 阅读详情

MapReduce中,分片、分区、排序和分组(Group)的关系图:

 

分片大小

对于HDFS中存储的一个文件,要进行Map处理前,需要将它切分成多个块,才能分配给不同的MapTask去执行。 分片的数量等于启动的MapTask的数量。默认情况下,分片的大小就是HDFS的blockSize。

Map阶段的对数据文件的切片,使用如下判断逻辑:

  protected long computeSplitSize(long blockSize, long minSize,
                                  long maxSize) {
    return Math.max(minSize, Math.min(maxSize, blockSize));
  }

blockSize:默认大小是128M(dfs.blocksize)

minSize:默认是1byte(mapreduce.input.fileinputformat.split.minsize):

maxSize:默认值是Long.MaxValue(mapreduce.input.fileinputformat.split.minsize)

由此可以看出两个可以自定义的值(minSize和maxSize)与blockSize之间的关系如下:

当blockSize位于minSize和maxSize 之间时,认blockSize:

当maxSize小于blockSize时,认maxSize:

当minSize大于blockSize时,认minSize:

 

另外一个极端的情况,maxSize小于minSize时,认minsize,可以理解为minSize的优先级比maxSize大:

实际使用中,建议不要去修改maxSize,通过调整minSize(使他大于blockSize)就可以设定分片(Split)的大小了。

总之通过minSize和maxSize的来设置切片大小,使之在blockSize的上下自由调整。

什么时候需要调整分片的大小

首先要明白,HDFS的分块其实是指HDFS在存储文件时的一个参数。而这里分片的大小是为了业务逻辑用的。分片的大小直接影响到MapTask的数量,你可以根据实际的业务需求来调整分片的大小。

分区

 在Reduce过程中,可以根据实际需求(比如按某个维度进行归档,类似于数据库的分组),把Map完的数据Reduce到不同的文件中。分区的设置需要与ReduceTaskNum配合使用。比如想要得到5个分区的数据结果。那么就得设置5个ReduceTask。

自定义Partitioner:

复制代码

public class URLResponseTimePartitioner extends Partitioner<Text, LongWritable>{

    @Override
    public int getPartition(Text key, LongWritable value, int numPartitions) {
        String accessPath = key.toString();
        if(accessPath.endsWith(".do")) {
            return 0;
        }
        return 1;
    }
    
}

复制代码

然后可以在job中设置partitioner:

        job.setPartitionerClass(URLResponseTimePartitioner.class);
        //URLResponseTimePartitioner returns 1 or 0,so num of reduce task must be 2
        job.setNumReduceTasks(2);

两个分区会产生两个最终结果文件:

复制代码

[root@centos01 ~]# hadoop fs -ls /access/log/response-time
17/12/19 14:53:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 3 items
-rw-r--r--   2 root supergroup          0 2017-12-19 14:49 /access/log/response-time/_SUCCESS
-rw-r--r--   2 root supergroup       7769 2017-12-19 14:49 /access/log/response-time/part-r-00000
-rw-r--r--   2 root supergroup      18183 2017-12-19 14:49 /access/log/response-time/part-r-00001

复制代码

其中00000中存放着.do的统计结果,00001则存放其他访问路径的统计结果。

复制代码

[root@centos01 ~]# hadoop fs -cat /access/log/response-time/part-r-00001 |more
17/12/19 14:55:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
//MyAdmin/scripts/setup.php     3857
//css/console.css       356
//css/result_html.css   628
//images/male.png       268
//js/tooltipster/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.css  1806
//js/tooltipster/css/tooltipster.bundle.min.css 6495
//myadmin/scripts/setup.php     3857
//phpMyAdmin/scripts/setup.php  3857
//phpmyadmin/scripts/setup.php  3857
//pma/scripts/setup.php 3857
/404/search_children.js 3827
/Dashboard.action       3877
/Homepage.action        3877
/My97DatePicker/WdatePicker.js  9371
/My97DatePicker/calendar.js     22044
/My97DatePicker/lang/zh-cn.js   1089
/My97DatePicker/skin/WdatePicker.css    158
/My97DatePicker/skin/default/datepicker.css     3486
/My97DatePicker/skin/default/img.gif    475

复制代码

 

排序

要想最终结果中按某个特性排序,则需要在Map阶段,通过Key的排序来实现。

例如,想让上述平均响应时间的统计结果按降序排列,实现如下:

关键就在于这个用于OUTKey的Bean。它实现了Comparable接口,所以输出的结果就是按compareTo的结果有序。

由于这个类会作为Key,所以它的equals方法很重要,会作为,需要按实际情况重写。这里重写的逻辑是url相等则表示是同一个Key。(虽然Key相同的情况其实没有,因为之前的responseTime统计结果已经把url做了group,但是这里还是要注意有这么个逻辑。)

排序并不是依赖于key的equals!

复制代码

    public class URLResponseTime implements WritableComparable<URLResponseTime>{
    String url;
    long avgResponseTime;

    public void write(DataOutput out) throws IOException {
        out.writeUTF(url);
        out.writeLong(avgResponseTime);
    }

    public void readFields(DataInput in) throws IOException {
        this.url = in.readUTF();
        this.avgResponseTime = in.readLong();
    }

    public int compareTo(URLResponseTime urt) {
        return this.avgResponseTime > urt.avgResponseTime ? -1 : 1;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public long getAvgResponseTime() {
        return avgResponseTime;
    }

    public void setAvgResponseTime(long avgResponseTime) {
        this.avgResponseTime = avgResponseTime;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((url == null) ? 0 : url.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        URLResponseTime other = (URLResponseTime) obj;
        if (url == null) {
            if (other.url != null)
                return false;
        } else if (!url.equals(other.url))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return url;
    }
    

}

复制代码

 

 然后就简单了,在Map和Reduce分别执行简单的写和读操作就行了,没有更多的处理,依赖于Hadoop MapReduce框架自身的特点就实现了排序:

复制代码

public class URLResponseTimeSortMapper extends Mapper<LongWritable,Text,URLResponseTime,LongWritable>{
    

    //make a member property to avoid new instance every time when map function invoked.
    URLResponseTime key = new URLResponseTime();
    LongWritable value = new LongWritable();

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        
        String line = value.toString();
        String[] logs = line.split("\t");
        String url = logs[0];
        String responseTimeStr = logs[1];
        
        long responseTime = Long.parseLong(responseTimeStr);
        
        
        this.key.setUrl(url);
        this.key.setAvgResponseTime(responseTime);
        this.value.set(responseTime);
        context.write(this.key,this.value);
    }

    
}

复制代码

 

复制代码

public class URLResponseTimeSortReducer extends Reducer<URLResponseTime, LongWritable, URLResponseTime, LongWritable> {

    
    @Override
    protected void reduce(URLResponseTime key, Iterable<LongWritable> values,
            Context ctx) throws IOException, InterruptedException {
        ctx.write(key, values.iterator().next());
    }

    
}

复制代码

 

 

 

 

 


 

参考:

Hadoop Wiki,HowManyMapsAndReduces :https://wiki.apache.org/hadoop/HowManyMapsAndReduces

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码) 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码) 文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)small demo抛物线demo飞机高度demoC++实例参考文献 我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布 阅读详情

相关推荐

手把手教你用Kali+字典爆破WiFi密码:从抓包到破解的完整流程

本文提供了一份详尽的无线网络渗透测试实战指南,重点讲解如何使用Kali Linux和Aircrack-ng套件进行WiFi安全评估。内容涵盖从硬件选型(如RTL8812AU网卡)、驱动配置、监听模式设置,到使用airodump-ng扫描抓包、捕获WPA握手包,以及利用字典进行离线破解的完整流程。同时强调了在授权环境下进行安全测试的重要性,并给出了相应的网络加固建议。

weixin_28568819的博客 1674

大数据学习(5)MapReduce切片(Split)和分区(Partitioner)

MapReduce中,分片、分区、排序和分组(Group)的关系图: 分片大小 对于HDFS中存储的一个文件,要进行Map处理前,需要将它切分成多个块,才能分配给不同的MapTask去执行。分片的数量等于启动的MapTask的数量。默认情况下,分片的大小就是HDFS的blockSize。 Map阶段的对数据文件的切片,使用如下判断逻辑: protected long c...

weixin_34417635的博客 776

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3596

Hadoop学习(9)----MapReduce阶段的Split阶段

一、介绍 在上一届的信息中我们已经知道MapReduce框架,在处理过程中主要分为四个阶段:Split(分片)阶段、Map阶段、Shuffle(混排、重拍)阶段、Reduce阶段。接下来笔者将会分别详细介绍着四个阶段,也会加上Hadoop2.6.0的源码进行分析。从而加深读者对Split阶段的理解。 我们知道从文件开始读取,经过一些列处理后,文件数据将以键值对的方式进入到Map阶段中,这就是S

wozipa的博客 3454

基于ARDUINIO的5路红外循迹小车

基于ARDUINIO的5路红外循迹小车 新手抄袭了很多大神的代码。这里表示感谢。 #define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define STURNLEFT 3 #define STURNRIGHT 4 #define TURNLEFT 5 #define TURNRIGHT 6 #define TURNRIGHT90 7 #define TURNLEFT90 8 int leftA_PIN = A0; int

weixin_48214416的博客 4381

Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案

AI Agent作为当前人工智能应用开发的核心范式,通过赋予大语言模型(LLM)自主规划、工具调用和环境交互能力,正在重塑软件智能化进程。其技术原理基于智能体架构,通过提示工程、函数调用和记忆机制,将LLM从单纯的文本生成器转变为能够执行复杂任务的工作流引擎。这一技术价值在于显著降低了构建智能应用的开发门槛,同时保持了高度的灵活性和可扩展性。在实际应用场景中,AI Agent广泛落地于智能客服、代码助手、数据分析自动化等领域,成为连接大模型能力与具体业务需求的关键桥梁。本文聚焦的Koog框架,正是针对JVM

weixin_42594419的博客 395

MapReduce原理之---分区、分组、切块、切片

分区和分组的区别: 1、分区: 一个分区就是一个任务;当数据量大,单个reducetask处理不了时,需要多个reducetask同时处理全部数据; partition调用HashPartitioner组件,获得区号; HashPartitioner.getPartition(nk,nv){ nk.hashcode%numberReduceTasks; } 分区能够保证同一个逻辑下的K到达同一个reducetask中,按照K进行全局聚合、排序、分组;保证处理全部数据;保证处理的数据不重复。 2、分组: 分组

weixin_45484707的博客 2832

案例:无人船测量点位数据+ArcGIS 10.6软件生成三维水下地形的两种方法

通常情况下,采用无人船进行水下地形测量,得到的是离散的,具有点号、日期、时间、东坐标(E)、北坐标(N)、水面高程、水下高程和水深等信息的点位数据,该数据一般由航带点位数据加水岸线组成,如下图所示: 原始点位数据格式如下: 下面讲解在ArcGIS软件中生成三维水下地形的两种常用方法。 一、构建不规则三角网(Tin) 1、创建Tin 生成的Tin: 2、Tin转栅格 Tin to Raster: 三维展示: 二、空间插值 栅格插值常用的方法有:克里...

智慧空间实验室 6746

2.2 MapReduce之Split原理

InputFormat.class getSplits 注意是package org.apache.hadoop.mapreduce;包 Logically split the set of input files for the job. 逻辑上的分片 List<InputSplit> getSplits RecordReader /** * Logically split the set of input files for the job. * * &

ifeng 731

纳米尺度仿真软件:GROMACS_(3).分子动力学模拟原理

分子动力学(MD)模拟是一种强大的计算方法,通过数值积分牛顿运动方程,追踪粒子在时间上的位置和速度变化,提供关于体系动力学行为的详细信息。选择合适的力场、设置初始条件、应用边界条件、控制温度和压力、选择合适的时间步长、计算能量和力,是 MD 模拟的关键步骤。通过这些步骤,可以对各种化学、生物和材料体系进行模拟和分析,揭示其结构、动力学和热力学性质。高级应用如反应路径模拟和蛋白质折叠研究,进一步扩展了 MD 模拟的应用范围。

kkchenjj的博客 1100

使用微信小程序开发制作一个简单的在线问答应用

以上就是一个简单的在线问答小程序的开发过程。其中包括前端界面的布局和逻辑,后端接口的设计和实现,以及部署和测试的步骤。通过以上步骤,你可以自己尝试开发一个类似的在线问答应用。

2401_85258012的博客 791

MapReduce的运行原理讲解

MapReduce是一种编程模型,它是用于大规模数据集的并行运算,极大地方便了编程人员咋不会分布式并行变成的情况下,将自己的程序运行在分布式系统上。 MapReduce的原理总之就是一句话----分久必合,合久必分 Map和Reduce是分开的两个部分,Map不是我们所学习的Map集合而是代表了切割,而Reduce就是合并,以下就是MapReduce的运行原理图 首先我们在磁盘中获取大量数据源后...

大数据让未来充满希望 482

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

MapReduce补充-排序-分组-切片和shuffle机制Split切片机制

MapReduce执行流程中Shuffle机制和Split机制: 1.MrAppMaster(任务监控调度机制)向ResourceManager领取任务 2.MrAppMaster分配一些NodeManager节点运行map task任务 3.map task通过 inputFormat的子类FileInputFormat(默认这里可以自义定比如读取图片)遍历所有文件得到blogsiz...

锦衣夜行_ 598

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MapReduce详细工作流程解析

MapReduce工作流程一.流程示意图二.流程详解1.split阶段2.map阶段3.Shuffle阶段4.Reduce阶段5.注意三.各个阶段的工作机制1.InputFormat数据输入1.1FileInputFormat抽象类1.1.1FileInputFormat源码解析1.1.2FileInputFormat切片大小的参数配置1.1.3获取切片信息1.1.4总结1.2FileInputFormat实现类1.2.1TextInputFormat1.2.2KeyValueTextInputFormat

May_J_Oldhu的博客 8866

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

详解MapReduce(Spark和MapReduce对比铺垫篇)

本来今天是不打算写MapReduce的,但是考虑到目前很多公司还都在用这个计算引擎,以及后续要讲的Hive原生支持的计算引擎也是MapReduce,并且为Spark和MapReduce的对比做铺垫,笔者今天详细阐述一下MapReduce。鉴于Hadoop1.X已过时,Hadoop3.X目前用的还不多,企业中目前大量运用的还是Hadoop2.X,所以以下都是基于Hadoop2.X版本的MapRedu...

智海观潮的博客 616

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Mapreduce工作流程与简介

最近几天一直在学习关于大数据方面的相关技术,今天学习了MapReduce的工作流程,让我对数据地处理有了新的认识,接下来我分享一下关于MapReduce2.0的工作流程 Mapreduce简介 Hadoop MapReduce 源于Google发表的 MapReduce论文。Hadoop MapReduce 其实就是Google MapReduce的一个克隆版本。Hadoop 2.0即第二代Had...

SqrsCbrOnly1的博客 5366

MapReduce简介和wordcount

MapReduce简介 WordCount MyMap MyReduce MyJob package com; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.ha...

学习笔记 834

MapReduce工作原理及1.0版本调度原理

MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框,就是mapreduce,缺一不可,也就是说,可以通过mapreduce很容易在hadoop平台上进行分布式的计算编程。 1:MR工作原理 1.1:工作原理流程 流程大致如:split---->map---->map输出溢写---->分区---->排序(合并)---->溢写到磁盘 1.2:Split切片->Map 每个输入分片(input

gaofeng的博客 1236

MapReduce总体工作机制

MapTask运行机制详解 整个Map阶段流程大体如图所示: 简单概述 inputFile通过split被逻辑切分为多个split文件, 通过Record按行读取内容给map(用户自己实现的)进行处理, 数据被map处理结束之后交给OutputCollector收集器,对其结果key进行分区(默认使用hash分区), 然后写入buffer,每个map task都有一个内存缓冲区, 存储着map的...

写的不好之处,请指教 6010

MapReduce框架原理

目录总框架数据输入job提交源码切片机制FileInputFormat切片机制CombineTextInputFormat切片机制FileInputFormat 实现类TextInputFormat(默认实现类)CombineTextInputFormatKeyValueTextInputFormatNLineInputFormat自定义MapTask阶段shuffle机制ReduceTask阶段数据输出 总框架  准备map处理的输入数据 -》mapper处理-》Shuffle-》Reduce处理-》

weixin_45034290的博客 178

Hadoop学习笔记: MapReduce(2)

一. 切片与MapTask并行度决定机制 现有如下的问题: 1G的数据, 启动8个MapTask, 可以提高集群的并发处理能力. 那么1K的数据, 如果也启动8个MapTask, 会提高集群性能吗? MapTask并行任务是否是越多越好呢? 哪些因素影响了MapTask并行度? MapTask并行度决定机制 首先需要区分两个概念: 1.数据块: 数据块(Blocks)是HDFS物理上把数据分成不同的块. 数据块是HDFS的存储数据单位 2.数据切片:数据切片只是在逻辑上对输入进行分片, 并不会在...

weixin_42305093的博客 1182

MapReduce模块

1111111111111111111111

wenqiangW_的博客 1163

Mapreduce(占40分)

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

wsyczhhh的博客 347

mapreduce 文件可以切分吗_详解MapReduce

详解MapReduce(Spark和MapReduce对比铺垫篇)​mp.weixin.qq.com本来今天是不打算写MapReduce的,但是考虑到目前很多公司还都在用这个计算引擎,以及后续要讲的Hive原生支持的计算引擎也是MapReduce,并且为Spark和MapReduce的对比做铺垫,笔者今天详细阐述一下MapReduce。鉴于Hadoop1.X已过时,Hadoop3.X目前用的还不多...

weixin_42622428的博客 689

Day39~40_Hadoop之MapReduce(二)

<!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>bd-offcn-01:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp...

qq_36972345的博客 302
上一篇: maven报错:Non-resolvable parent POM for com.taotao:Taotao-common:0.0.1-SNAPSHOT: Could not find artifa
下一篇: JVM架构和GC垃圾回收机制
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值