• 【Hadoop】学习笔记(七)


    三、MapReduce

    3.12、ETL数据清洗

    3.12.1、数据清洗(ETL)

    ETL:是Extract-Transform-Load的缩写,用来描述将数据从来源端经过 抽取(Extract)转换(Transform)加载(Load) 至目的端的过程。

    ETL较常用于数据仓库,但其对象并不限于数据仓库。

    在运行核心业务MapReduce之前,往往需要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行Mapper程序,而不需要运行Reducer程序。

    例如,我们需要对文本文件中,过滤掉字段数量不足的数据行。

    可以在Mapper中获取一行数据,split切割后判断字段数量是否满足要求,不满足要求就不再交给context。

    因为这些步骤都在Mapper中,所以我们可以设置ReduceTask数量为0。

    常见的匹配规则:

    • 匹配中文:[\u4e00-\u9fa5]
    • 英文字母:[a-zA-Z]
    • 数字:[0-9]
    • 匹配中文、英文、数字、下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
    • 匹配中文、英文、数字、下划线,同时匹配长度:^[\u4e00-\u9fa5_a-zA-Z0-9]{4,10}
    • 不能以下划线开头:(?!_)
    • 不能以下划线结尾:(?!.?_$)
    • 至少一个汉字、数字、字母、下划线:[a-zA-Z0-9_\u4e00-\u9fa5]+
    • 只含有汉字、数字、字母、下划线,且不限制下划线位置:^[a-zA-Z_\u4e00-\u9fa5]
    • 由数字、字母、下划线组成:^\w+$
    • 最长不超过7个汉字,或者14个字节:^[\u4e00-\u9fa5]{1,7}$|^[\dA-Aa-z_]{1,14}$
    • 匹配双字节字符(包括汉字),可以用来计算字符串长度:[^x00-xff]
    • 匹配空白行:ns*r
    • 匹配首尾空白字符(空格、制表符、换页符等):^s*|s*$
    String str = "";  // 要判断的字符串
    String reg = ""; // 正则表达式
    if(str.matches(reg)) {
        // .....
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.13、数据压缩

    3.13.1、数据压缩

    优点:减少磁盘IO、减少占用的磁盘存储空间

    缺点:增加CPU开销。

    原则:

    • 对于IO密集型 job ,可以多用压缩
    • 对于运算密集型的 job,少用压缩

    3.13.2、压缩编码

    压缩算法对比:

    压缩格式Hadoop自带算法文件扩展名是否可切片转成压缩后,是否需要修改原始程序
    DEFLATE是,可以直接使用DEFLATE.deflate和文本处理一样,不需要修改程序
    Gzip是,可以直接使用DEFLATE.gz和文本处理一样,不需要修改程序
    bzip2是,可以直接使用bzip2.bz2和文本处理一样,不需要修改程序
    LZO否,需要安装LZO.lzo需要建索引,还需要指定输入格式
    Snappy是,可以直接使用Snappy.snappy和文本处理一样,不需要修改程序

    LZO的压缩率不如Gzip、biz2,但是压缩速度、解压速度非常快。支持split切片,但是切片需要额外创建索引。

    Gzip压缩率 比较高,压缩/解压速度一般般。

    bzip2压缩率非常高,可以将一个大文件压缩成一个很小的文件,但是压缩速度、解压速度非常缓慢。支持split切片

    Snappy设计的目的也不是为了高压缩率,而是为了非常快的速度和合理的压缩。在 64位i7 处理器环境,snappy的压缩速度可以达到每秒250Mb,解压速度每秒500Mb。

    Snappy是谷歌开源的,在谷歌内部被广泛用于 BigTable、MapReduce等内部 RPC 系统。

    3.13.3、压缩位置

    压缩可以在MapReduce作用的任意阶段启动,一般分为:

    • 输入端压缩
    • Mapper输出端压缩
    • Reducer输出端压缩

    在这里插入图片描述

    3.13.4、压缩参数配置

    为了支持多种压缩/解压格式,Hadoop引入了编码/解码器:

    压缩格式对应的编码/解码器
    deflateorg.apache.hadoop.io.compress.DefaultCodec或者:org.apache.hadoop.io.compress.DeflateCodec
    gziporg.apache.hadoop.io.compress.GzipCodec
    bzip2org.apache.hadoop.io.compress.BZip2Codec
    LZ4org.apache.hadoop.io.compress.Lz4Codec
    zstdorg.apache.hadoop.io.compress.ZStandardCodec
    LZOcom.hadoop.compression.lzo.LzopCodec

    开启压缩需要配置相关的参数:

    配置文件参数默认值压缩阶段建议
    core-site.xmlio.compression.codecs无需要使用命令 hadoop checknative查看支持的本地库压缩方式输入阶段Hadoop使用文件扩展名判断是否支110持某种编码/解码器
    mapred-site.xmlmapreduce.map.output.compressfalsemapper输出这个参数设置为true启动压缩
    mapred-site.xmlmapreduce.map.output.compress.codecorg.apache.hadoop.io.compress.DefaultCodecmapper输出企业中多使用 LZO 或者 Snappy 编码/解码器在此阶段压缩数据
    mapred-site.xmlmapreduce.output.fileoutputformat.compressfalsereducer输出这个参数设置为true启用压缩
    mapred-site.xmlmapreduce.output.fileoutputformat.compress.codecorg.apache.hadoop.io.compress.DefaultCodecreducer输出使用标准工具或者编码/解码器,例如gzip/biz2

    也可以在 Java 程序中,对某个MapReduce开启压缩:(即:不在xml中配置,而是在configuration对象中添加配置信息)

    // 开启mappper端输出压缩
    configuration.setBoolean("mapreduce.map.output.compress", true);
    // 设置mappper输出的压缩方式
    configuration.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);
    
    //  也可以通过FileOutputFormat工具进行配置,(实际上也是对configuration对象添加了配置项)
    // 设置reduce端输出压缩开启
    FileOutputFormat.setCompressOutput(job, true);
    // 设置压缩的方式
    FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    win10 LTSC无损升级 win11专业版 记录
    数据库慢查询介绍并优化
    瀑布型项目管理最常用的10个小工具,可以自由搭建使用
    Redis的持久化机制
    传统电网转型新趋势:边缘计算引入智能电网
    R语言使用scale函数将向量数据或者dataframe指定数据列转换为Z分数(z-Scores、转化为规范化数据)
    【文献阅读】【NMI 2022】LocalTransform :基于广义模板的有机反应性准确预测图神经网络
    Android-Fragment知识详解
    【SwiftUI模块】0021、SwiftUI做一个基于拖动手势位置的精美扩展工具栏
    工厂如何实现智能制造?有哪些需要注意的?
  • 原文地址:https://blog.csdn.net/lushixuan12345/article/details/126556857