【Hadoop】MapReduce (六)

MapReduce

组件

输入格式 - InputFormat

  1. InputFormat发生在Mapper之前,用于对数据进行切分和读取,会将读取到的数据传递给MapTask处理。所以InputFormat读取到的数据是什么格式,Mapper接收到的数据就是什么格式

  2. 作用

    1. getSplits:对文件进行切片处理
    2. createRecordReader:创建输入流读取文件
  3. 默认情况下,MapReduce中使用的输入格式是TextInputFormatTextInputFormat继承了FileInputFormat。需要注意的是,FileInputFormat负责切片,TextInputFormat负责读取

  4. FileInputFormat切片过程中需要注意的问题:

    1. 默认情况下,minSplitSize=1B,maxSplitSize=Long.MAX_VALUE

    2. 在MapReduce中,_开头的文件默认是隐藏文件不处理

    3. 如果当前文件是一个空文件,那么这个文件本身就是一个切片

    4. 在MapReduce中,文件有可切和不可切的区别。大部分情况下,文件是可切的,但如果是压缩文件,那么不一定可切

    5. 如果文件不可切,那么这整个文件就是一个切片

    6. 默认情况下,Split和Block等大

      在这里插入图片描述

    7. 如果需要调大SplitSize,那么需要调大minSize;如果需要调小SplitSize,那么需要调小maxSize

      // 单位是字节
      FileInputFormat.setMinInputSplitSize();
      FileInputFormat.setMaxInputSplitSize();
      
    8. 切片过程中需要SPLIT_SLOP,默认值是1.1。当bytesRemaining/splitSize > SPLIT_SLOP才会继续切片。所以,如果一个文件是520M,那么对应了5个Block(4*128+8),对应了4个Split(3*128+136)

  5. TextInputFormat读取过程中需要注意的问题:

    1. TextInputFormat在读取文件之前会先判断文件是否可切:先获取文件的压缩编码,判断压缩编码是否为空。如果压缩编码为空,那么说明不是压缩文件,该文件可切;如果压缩编码不为空,那么判断是否是一个可切分的压缩文件
    2. 在MapReduce中,默认可切的压缩编码是BZip2Codec,后缀是.bz2
    3. 在读取文件的时候,会先获取每条数据之间的分隔符,默认情况下,分隔符是\n。可以通过textinputformat.record.delimiter来指定每一条数据之间的间隔符号
    4. 确定好间隔符之后,会创建输入流LineRecordReader对象来读取数据
    5. 默认情况下,是按行读取数据,每一行数据最多允许有Integer.MAX_VALUE个字节
    6. 在读取文件的时候,会判断文件是否是一个压缩文件。如果不是压缩文件,那么直接读取;如果是压缩文件,那么解压之后再读取
    7. 为了保证数据处理的完整性,除了第一个MapTask以外,其他的MapTask都需要从当前切片的第二行开始,处理到下一个切片的第一行;第一个MapTask要多处理一行;最后一个MapTask会少处理一行数据
  6. 实际过程中,如果给定的数据和MapReduce提供的输入格式不匹配,那么此时可以考虑自定义输入格式。考虑到文件还需要进行切片,所以可以定义一个类继承FileInputFormat,此时只需要考虑怎么读取数据即可

  7. 多源输入:在MapReduce中,如果需要同时处理多个文件,且多个文件位于多个位置,那么此时需要使用多源输入

    1. 在多源输入中,输入的文件格式不可以不同,可以给每一个文件单独指定一个InputFormat
    2. 在多源输入中,如果输出格式不同,或者Mapper逻辑不同,那么此时可以给每一个文件单独指定一个Mapper

输出格式 - OutputFormat

  1. OutputFormat发生在Reducer之后,负责将ReduceTask产生的数据按照指定格式写出到指定位置

  2. 作用

    1. 校验输出路径,主要是确定输出路径要不存在!!!
    2. 提供输出流将数据写出到指定位置
  3. 默认情况下,MapReduce中使用的输出格式是TextOutputFormatTextOutputFormat继承了FileOutputFormat。需要注意的是,FileOutputFormat负责校验路径,TextOutputFormat负责写出数据

  4. TextOutputFormat写出数据过程中需要注意的问题:

    1. 写出的时候,会先判断是否要对结果进行压缩

    2. 获取键值对之间的间隔符号,默认是\t。可以通过mapreduce.output.textoutputformat.separator来指定

    3. 如果对输出结果进行压缩,那么如果没有指定压缩编码,默认会压缩成.deflate

    4. 如果需要对输出结果进行压缩,那么需要在入口类中添加

      FileOutputFormat.setCompressOutput(job, true);
      FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
      
  5. 实际过程中,如果需要指定特殊的输出格式,那么就需要自定义输出格式。需要定义一个类继承OutputFormat,但是考虑到还需要校验输出路径是否存在,所以一般是继承FileOutputFormat

  6. 扩展:多源输出。将数据根据分类,将结果输出到不同的文件中。案例:字符统计。将字母、数字和符号分别放到不同的文件中进行统计

补充

单例模式

  1. 单例模式(Singleton)是设计模式中最常见、最简单的模式之一 ,属于构建/建造型模式

  2. 设计模式(design pattern):针对软件开发过程中的某一类问题形成的方案。到目前为止,在软件开发过程中,有上百种设计模式,其中比较常用的有24种

  3. 单例模式,顾名思义,指的是在全局只存在唯一的一个实例对象

  4. 单例模式有六种实现方式:饿汉式懒汉式、单重所、双重锁(DCL)、枚举式、内部类式

    1. 饿汉式

      public class A {
          // 在类中准备好一个对象,希望所有的使用者都只用准备号的唯一对象
          // 饿汉式:在定义对象的时候就初始化对象
          // 缺点:无论是否需要使用这个对象,在第一次调用这个类的时候都会初始化这个对象,从而增长了类的加载时间
          // 优点:没有线程的并发问题 - 类只加载一次,所以静态对象也只初始化一次
          private static final A a = new A();
          // 不允许在类外随便创建对象 - 构造函数私有化
          private A(){}
          public static A get(){return a;}
      }
      
    2. 懒汉式

      public class A {
          
          // 懒汉式:在定义对象的时候不初始化对象,而是在第一次调用方法的时候再初始化这个对象
          // 优点:在有需要的时候才会初始化对象,从而缩短了类的加载时间
          // 缺点:会产生线程的并发问题
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null) a = new A();
              return a;
          }
      }
      
    3. 单重锁

      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              // 优点:保证线程的并发安全
              // 缺点:锁本质上就是保证线程的"独占",因此加锁和解锁都需要消耗资源
              // 当对象被初始化之后,后续的所有的线程都需要先加锁,然后判断是否为空,再解锁,也就意味着所有的线程都需要经历锁的过程
              synchronized(A.class){
                  if(a == null) a = new A();
              }
              return a;
          }
      }
      
    4. 双重锁(DCL - Double Check Lock)

      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null){
                  synchronized(A.class){
                  	if(a == null){
                      	synchronized(A.class){
                              a = new A();
                          }
                      }
              	}
              }
              return a;
          }
      }
      
    5. 枚举式

      enum A{
          a
      }
      
    6. 内部类式

      public class A {
          
          public static class AI{
              private static final AI instance = new AI();
          }
          
          public static AI getInstance(){
              return AI.instance;
          }
          
      }
      

    private static final AI instance = new AI();
    }

       public static AI getInstance(){
           return AI.instance;
       }
    

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO系列改进,自研模块助力涨点

目录 一、原理 二、代码 三、添加到YOLOv5中 一、原理 论文地址:

“先锋”西凤

执笔 | 文 清 编辑 | 古利特 制曲是酿酒的第一道工序,也是中国酿酒史上的一大创新,对白酒风味的影响至关重要。西凤酿酒人坚信“曲是酒之骨”,“曲”的品质决定酒的“骨气”,“酒曲”是酒体形成主题风味的基本定型元素和催化剂…

OpenNJet如何做到让用户永远在线

前言 最近看到了国内开源的一个名为OpenNJet的项目,有一个响亮的口号:“下一代云原生应用引擎”。 一下子就被吸引到了。 先看下官方对OpenNJet的介绍: OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序&…

如何根据配置动态生成Spring的Bean?

一、问题解析 在 Spring 应用中,根据运行时的配置(比如数据库配置、配置文件、配置中心等)动态生成 Spring Bean 是一种常见需求,特别是在面对多环境配置或者需要根据不同条件创建不同实例时。 Spring 提供了几种方式来实现这一需…

spice common模块

库分为三部分libspice-common.a,libspice-common-client.a,libspice-common-server.a。 1、libspice-common.a工程编译代码 # # libspice-common # spice_common_sources [ agent.c, agent.h, backtrace.c, backtrace.h, canvas_utils.c, canvas_utils.h, demarsha…

sql编写规范(word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

高德地图在vue3项目中使用:实现画矢量图、编辑矢量图

使用高德地图实现画多边形、矩形、圆&#xff0c;并进行编辑保存和回显。 1、准备工作 参考高德地图官网&#xff0c;进行项目key申请&#xff0c;链接: 准备 2、项目安装依赖 npm i amap/amap-jsapi-loader --save3、地图容器 html <template><!-- 绘制地图区域…

GNSS 地球自转改正算例分析

文章目录 Part.I IntroductionPart.II 由地球自转引起的误差的概念和改正方法Chap.I 误差概念Chap.II 改正方法 Part.II 算例分析Chap.I 基础数据Chap.II 计算过程 AppendixReference Part.I Introduction 为了更好地理解 地球自转改正&#xff0c;本文将介绍一个算例。 Part.…

手动交互式选点提取三维点云轮廓边界线 附python代码

一种新的三维点云轮廓边界提取方案: 1 手动选择一个边界或者其附近的点 2 自动搜索临近区域,并找到附近的平面和进行平面分割 3 提取平面的交点 4 该交点就是点云的轮廓边界点,把它往两边延展,就是完整的点云轮廓边界 import open3d as o3d import numpy as np import …

Java模块化系统:引领代码革命与性能飞跃

JDK工程结构的问题 在说Java模块化系统之前&#xff0c;先来说说Java9之前的JDK在工程结构上的问题&#xff0c;从JDK本身的问题说起&#xff0c;Java从1996年发布第一版到2017年发布Java9&#xff0c;中间经历了近20年的时间&#xff0c;在这期间发布了无数个大大小小的版本用…

RESTFul风格设计和实战

四、RESTFul风格设计和实战 4.1 RESTFul风格概述 4.1.1 RESTFul风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量级的通信协议&#x…

YAML如何操作Kubernetes核心对象

Pod Kubernetes 最核心对象Pod Pod 是对容器的“打包”&#xff0c;里面的容器&#xff08;多个容器&#xff09;是一个整体&#xff0c;总是能够一起调度、一起运行&#xff0c;绝不会出现分离的情况&#xff0c;而且 Pod 属于 Kubernetes&#xff0c;可以在不触碰下层容器的…

存储或读取时转换JSON数据

一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题&#xff1a; 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …

Feign 和 OpenFeign 的区别

Feign 和 OpenFeign 都是用来进行服务间调用的客户端库&#xff0c;它们旨在简化HTTP API客户端的编写过程&#xff0c;使得编写对外部服务的接口就像调用本地方法一样简单。尽管它们有相似之处&#xff0c;但也存在一些关键差异&#xff1a; 归属和演进&#xff1a; Feign 最初…

硬件设计计划与APQP

硬件设计的关键节点: 大的里程碑milestone分为: Kickoff->A Samples->做出第一批B样总成件->B Samples/OTS->C Samples->PPAP->SOP 具体到硬件,A/B/C sample阶段,又可细分为: 关键器件选型&硬件系统方案设计原理图绘制PCB LayoutA_BOM输出PCB制板…

3. 深度学习笔记--优化函数

深度学习——优化器算法Optimizer详解&#xff08;BGD、SGD、MBGD、Momentum、Adagrad、Adadelta、RMSprop、Adam、Nadam、AdaMax、AdamW &#xff09; 0. GD &#xff08;梯度下降&#xff09; Gradient Descent&#xff08;梯度下降&#xff09;是一种迭代优化算法&#xf…

FreeRTOS内存管理(1-20)

FreeRTOS内存管理简介 在使用FreeRTOS创建任务&#xff0c;队列&#xff0c;信号量等对象时&#xff0c;一般都提供两种方法 1&#xff1a;动态创建任务&#xff08;方法&#xff09;自动地从FreeRTOS管理的内存堆中申请创建对象所需要的内存&#xff0c;并且在删除对象后可以…

九州金榜|孩子沉迷于网络:家庭教育的挑战与对策

随着时代的进步&#xff0c;科技的发展&#xff0c;网络现在成为了我们日常生活不可分割的一部分。然而&#xff0c;随着网络的普及也出现了一些列的问题&#xff0c;其中孩子沉迷于网络就是当前家长最为关心的问题&#xff0c;对于这种情况的发生&#xff0c;家庭教育就显得尤…

Linux主机重启后报错:[FAILED] Failed to start Switch Root.

一、问题描述 某次云主机因计费问题&#xff0c;导致批量重启&#xff0c;重启后发现某台云主机竟进入紧急救援模式&#xff08;emergency模式&#xff09;&#xff0c;如下所示&#xff1a; 二、原因及处理 1&#xff09;原因&#xff1a;加载根分区失败&#xff0c;导致无…

Libcity笔记:原子文件

1 介绍 Libcity中的数据以原子文件的形式存在 2 原子文件类别 对于不同的交通预测任务&#xff0c;可能用到不同的原子文件&#xff0c;同一个数据集不一定包含全部六种原子文件 网格数据需要按照先行后列的顺序遍历OD数据需要按照先起点后终点的顺序遍历 2.1 geo 存储地理…