121-124-Hadoop-MapReduce-etl:

121-Hadoop-MapReduce-etl-压缩-总结:

ETL

“ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取 (Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL 一词较常用在数据仓库,但其对象并不限于数据仓库 在运行核心业务 MapReduce 程序之前,往往要先对数据进行清洗,清理掉不符合用户 要求的数据。清理的过程往往只需要运行 Mapper 程序,不需要运行 Reduce 程序。

1)需求

去除日志中字段个数小于等于 11 的日志。

(1)输入数据web.log

(2)期望输出数据

每行字段长度都大于 11。

2)需求分析

需要在 Map 阶段对输入的数据根据规则进行过滤清洗。

3)实现代码

(1)编写 WebLogMapper 类

package com.zh.mapreduce.etl;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WebLogMapper extends Mapper {
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        // 1 获取 1 行数据
        String line = value.toString();
        // 2 解析日志
        boolean result = parseLog(line, context);
        // 3 日志不合法退出
        if (!result) {
            return;
        }
        // 4 日志合法就直接写出
        context.write(value, NullWritable.get());
    }

    // 2 封装解析日志的方法
    private boolean parseLog(String line, Context context) {
        // 1 截取
        String[] fields = line.split(" ");
        // 2 日志长度大于 11 的为合法
        if (fields.length > 11) {
            return true;
        } else {
            return false;
        }
    }
}

(2)编写 WebLogDriver 类

package com.zh.mapreduce.etl;

import com.zh.mapreduce.outputformat.LogDriver;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class WebLogDriver {
    public static void main(String[] args) throws Exception {
        // 1 获取 job 信息
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);
        // 2 加载 jar 包
        job.setJarByClass(WebLogDriver.class);
        // 3 关联 map
        job.setMapperClass(WebLogMapper.class);
        // 4 设置最终输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(NullWritable.class);
        // 设置 reducetask 个数为 0
        job.setNumReduceTasks(0);
        // 5 设置输入和输出路径
        FileInputFormat.setInputPaths(job, new Path("E:\\input\\inputlog"));
        FileOutputFormat.setOutputPath(job, new Path("E:\\output\\output-log-01"));
        // 6 提交
        boolean b = job.waitForCompletion(true);
        System.exit(b ? 0 : 1);
    }
}

MapReduce开发总结

1)输入数据接口:InputFormat
(1)默认使用的实现类是:TextInputFormat
(2)TextInputFormat 的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为 value 返回。
(3)CombineTextInputFormat 可以把多个小文件合并成一个切片处理,提高处理效率。

2)逻辑处理接口:Mapper
用户根据业务需求实现其中三个方法:map() setup() cleanup ()

3)Partitioner 分区
(1)有默认实现 HashPartitioner,逻辑是根据 key 的哈希值和 numReduces 来返回一个
分区号;key.hashCode()&Integer.MAXVALUE % numReduces
(2)如果业务上有特别的需求,可以自定义分区。

4)Comparable 排序
(1)当我们用自定义的对象作为 key 来输出时,就必须要实现 WritableComparable 接
口,重写其中的 compareTo()方法。
(2)部分排序:对最终输出的每一个文件进行内部排序。
(3)全排序:对所有数据进行排序,通常只有一个 Reduce。
(4)二次排序:排序的条件有两个。

5)Combiner 合并
Combiner 合并可以提高程序执行效率,减少 IO 传输。但是使用时必须不能影响原有的业务处理结果。

6)逻辑处理接口:Reducer
用户根据业务需求实现其中三个方法:reduce() setup() cleanup ()

7)输出数据接口:OutputFormat
(1)默认实现类是 TextOutputFormat,功能逻辑是:将每一个 KV 对,向目标文本文件
(2)用户还可以自定义 OutputFormat。

Hadoop 数据压缩(了解)

压缩优点:以减少磁盘 IO、减少磁盘存储空间。

压缩缺点:增加 CPU 开销。

2)压缩原则

(1)运算密集型的 Job,少用压缩

(2)IO 密集型的 Job,多用压缩

MR 支持的压缩编码

1)压缩算法对比介绍

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

2)压缩性能的比较

121-124-Hadoop-MapReduce-etl:_第1张图片

http://google.github.io/snappy/

Snappy 是一个压缩/解压库。它的目标不是最大压缩,也不是与任何其他压缩库兼容;相反,它的目标是非常高的速度和合理的压缩。例如,与 zlib 的最快模式相比,Snappy 对于大多数输入要快一个数量级,但生成的压缩文件要大 20% 到 100%。在 64 位模式的 Core i7 处理器的单核上,Snappy 以大约 250 MB/秒或更高的速度压缩,并以大约 500 MB/秒或更高的速度解压。

压缩方式选择

压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否

可以支持切片。

Gzip 压缩

优点:压缩率比较高;

缺点:不支持 Split;压缩/解压速度一般;

Bzip2 压缩

优点:压缩率高;支持 Split;

缺点:压缩/解压速度慢。

Bzip2 压缩

优点:压缩率高;支持 Split;

缺点:压缩/解压速度慢。

Snappy 压缩

优点:压缩和解压缩速度快;

缺点:不支持 Split;压缩率一般;

压缩位置选择

压缩可以在 MapReduce 作用的任意阶段启用。

121-124-Hadoop-MapReduce-etl:_第2张图片

压缩参数配置

1)为了支持多种压缩/解压缩算法,Hadoop 引入了编码/解码器

121-124-Hadoop-MapReduce-etl:_第3张图片

2)要在 Hadoop 中启用压缩,可以配置如下参数

121-124-Hadoop-MapReduce-etl:_第4张图片

压缩实操案例(参考尚硅谷案例,地址https://www.bilibili.com/video/BV1Qp4y1n7EN?p=124)

Map 输出端采用压缩

即使你的 MapReduce 的输入输出文件都是未压缩的文件,你仍然可以对 Map 任务的中间结果输出做压缩,因为它要写在硬盘并且通过网络传输到 Reduce 节点,对其压缩可以提高很多性能,这些工作只要设置两个属性即可

1)给大家提供的 Hadoop 源码支持的压缩格式有:BZip2Codec、DefaultCodec WordCountDriver,Mapper Reducer 保持不变

// 开启 map 端输出压缩
conf.setBoolean("mapreduce.map.output.compress", true);
// 设置 map 端输出压缩方式
conf.setClass("mapreduce.map.output.compress.codec", 
BZip2Codec.class,CompressionCodec.class);

Reduce 输出端采用压缩

基于 WordCount 案例处理。

1)修改驱动,Mapper和Reducer保持不变

// 设置 reduce 端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
 FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class); 
// FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class); 
// FileOutputFormat.setOutputCompressorClass(job, 
DefaultCodec.class)

学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

你可能感兴趣的:(hadoop,大数据,hadoop,mapreduce,etl)