MapReduce【数据压缩】

news/2025/1/15 12:57:19/

 

目录

概述 

压缩的优缺点

优点

缺点

压缩的原则

 MapReduce支持的压缩编码

压缩算法对比

压缩性能比较

压缩方式的选择

Gzip 压缩

Bzip2 压缩

Lzo 压缩

Snappy 压缩

压缩位置选择

压缩位置选择

1、输入端采用压缩

 2、Mapper输出采用压缩

3、Reducer输出采用压缩

压缩实际开发的配置

配置参数

代码

Map输出端采用压缩

Reduce 输出端采用压缩


 


概述 

压缩的优缺点

优点

在shuffle阶段可以通过数据压缩来优化MapReduce作业的执行

《Hadoop权威指南》7.3.1 map 端 -p196:

在将压缩 map 输出写到磁盘的过程中对它进行压缩往往是一个好的主意,因为这样写入磁盘的速度会很快,节约磁盘空间,并且减少传给 reducer 的数据量。在默认情况下,输出是不压缩的,但只要将 mapreduce.map.output.compress 设置为 true ,就可以轻松启用这个功能。

缺点

reduce端对数据进行处理时需要解压缩,增加CPU开销

 《Hadoop权威指南》7.3 reduce 端 -p197:

为了合并,压缩的 map 输出都必须在内存中被解压缩。

压缩的原则

  •  运算密集型的Job,少用压缩(+-*/运算频繁)
  • IO密集型的Job,多用压缩

 MapReduce支持的压缩编码

压缩算法对比

压缩算法对比
压缩格式Hadoop3.x自带?算法文件扩展名是否可切片压缩后原程序是否需要修改

DEFLATE

DEFLATE.deflate不需要
GzipDEFLATE.gz不需要
bzip2bzip2.bz2不需要
LZOLZO.lzo需要建索引,还需要指定输入格式
SnappySnappy.snappy不需要

压缩性能比较

压缩性能对比
压缩算法原始文件大小压缩文件大小压缩速度解压速度
gzip8.3GB1.1GB17.5MB/S58MB/S

bzip2

8.3GB1.8GB2.4MB/S9.5MB/S
LZO8.3GB2.9GB49.3MB/S74.6MB/S

此外,Snappy的压缩速度能达到250MB/S,解压速度500MB/S!

压缩方式的选择

压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否
可以支持切片。

Gzip 压缩

优点:压缩率比较高;
缺点:不支持 Split;压缩/解压速度一般;

Bzip2 压缩

优点:压缩率高;支持 Split;
缺点:压缩/解压速度慢。

Lzo 压缩

优点:压缩/解压速度比较快;支持 Split;
缺点:压缩率一般;想支持切片需要额外创建索引

Snappy 压缩

优点:压缩和解压缩速度快;
缺点:不支持 Split;压缩率一般;

压缩位置选择

压缩可以在 MapReduce 作用的任意阶段启用。
Snappy 压缩
优点:压缩和解压缩速度快;
缺点:不支持 Split;压缩率一般;
4.3.5 压缩位置选择
压缩可以在 MapReduce 作用的任意阶段启用。
Snappy 压缩
优点:压缩和解压缩速度快;
缺点:不支持 Split;压缩率一般;

压缩位置选择

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

1、输入端采用压缩

无需指定使用的压缩方式,Hadoop可以自动检查文件的扩展名,如果扩展名可以匹配,就会用恰当的编码方式对文件进行压缩和解压缩。也只有这里需要考虑压缩是否支持切片。
  1. 当数据量小于块大小,重点考虑压缩和解压缩速度比较快的LZO/Snappy(尤其是Snappy)
  2. 数据量非常大,重点考虑支持切片的Bzip2和LZO

 2、Mapper输出采用压缩

需要考虑 MapTask网络传输到 ReduceTask ,跨服务器通讯。重点考虑压缩和解压缩块的LZO、Snappy(尤其是Snappy)

3、Reducer输出采用压缩

如果数据永久保存,考虑压缩率比较高的Bzip2和Gzip(毕竟这一步后直接就输出到文件系统了,可以压缩的慢一点)。

如果这个数据还要作为下一个 MapTask 的输入,就需要考虑数据量是否支持切片了。

压缩实际开发的配置

配置参数

压缩格式对应的编码/解码器
DAFLATEorg.apache.hadoop.io.compress.DefaultCodec
gziporg.apache.hadoop.io.compress.GzipCodec
bzip2org.apache.hadoop.io.compress.BZip2Codec
LZOorg.apache.hadoop.io.compress.LzopCodec
Snappyorg.apache.hadoop.io.compress.SnappyCodec

注意:Snappy需要在 CentOS7.5 + hadoop3.0 的环境。

参数默认值阶段建议
io.compression.codecs
(在 core-site.xml 中配置)
默认为空,这个需要在命令行输入
hadoop checknative 查看
map端输入压缩
Hadoop 使用文件扩展
名判断是否支持某种
编解码器
mapreduce.map.output.compr
ess(在 mapred-site.xml 中
配置)
false(默认)
mapper 输出
这个参数设为 true 启
用压缩
mapreduce.map.output.compr
ess.codec(在 mapred-
site.xml 中配置)
org.apache.hadoop.io.com
press.DefaultCodec
mapper 输出
这个参数设为 true 启
用压缩
mapreduce.output.fileoutpu
tformat.compress(在
mapred-site.xml 中配置)
false(默认)
reducer 输出
这个参数设为 true 启
用压缩
mapreduce.output.fileoutpu
tformat.compress.codec(在
mapred-site.xml 中配置)
org.apache.hadoop.io.com
press.DefaultCodec
reducer 输出
使用标准工具或者编
解码器,如 gzip 和
bzip2

代码

在wordcount案例的基础上,只需要在运行类中添加语句,Mapper类和Reducer不需要修改

Map输出端采用压缩

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

Reduce 输出端采用压缩

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

注意:

1. 输入端和输出端的压缩方式可以不一样,hadoop会根据后缀名来自行匹配相应的压缩格式。

2. 本地模式下不可以使用Snappy压缩方式,因为Snappy需要hadoop3.0版本和CentOS7.5的环境,而windows环境下是不可以的。

 


至此,MapReduce的视频学习结束,接下来会继续学习YARN的相关课程,以及看着书来复习MapReduce的其他内容,毕竟视频内容可能有很多不够细节的地方,hadoop是大数据的重中之重,需要不断反复理解掌握,不能急于求成。

 


http://www.ppmy.cn/news/104264.html

相关文章

SpringBoot框架面试专题(初级-中级)-第一节

欢迎大家一起探讨相关问题,我们共同进步,喜欢的话可以关注点赞,后续会持续更新,谢谢~ 问题: 1.Spring Boot是什么?它与Spring Framework有什么区别? 解析: Spring Bo…

Rust 笔记:WebAssembly 的 JavaScript API

WebAssembly WebAssembly 的 JavaScript API 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/ar…

【研究生学术英语读写教程翻译 中国科学院大学Unit10】

研究生学术英语读写教程翻译 中国科学院大学Unit10 Unit 10 The Doctors Dilemma: ls lt Ever Good to Do Harm?医生的困境:伤害永远是好事吗?Unit 10 The Doctor’s Dilemma: ls lt Ever Good to Do Harm? 医生的困境:伤害永远是好事吗? Gwen Adshead Medical knowled…

Clion开发STM32之OTA升级模块(最新完整版)

前言 程序分为上位机部分、BootLoader、App程序上位机程序使用的是C#进行开发,目前只做成控制台部分开发环境依然选择Clion芯片采用的是stm32f103vet6升级模块已和驱动层逻辑进行分离 BootLoader程序 Flash分区定义 头文件 #ifndef STM32F103VET6_PROJECT_APP_FL…

认识.Net MAUI跨平台框架

.NET MAUI概念: 全称: .NET 多平台应用 UI (.NET MAUI) 是一个开源的跨平台框架,前身是Xamarin.Forms ! 用于使用 C# 和 XAML 创建本机移动和桌面应用。 NET MAUI,共享代码库,可在 Android、iOS、macOS 和 Windows 上运行的应用 应用架构: github 地址…

Socket(四)

文章目录 1. 服务器Socket简介2. 使用ServerSocket3. 用Socket写入服务器4. 关闭服务器Socket 1. 服务器Socket简介 博客Socket(一)~Socket(二)从客户端的角度讨论了Socket,客户端就是向监听连接的服务器打…

AJAX(一) -- AJAX的快速入门

目录 1. AJAX的概述: 2. JQuery的通用方式实现AJAX 3. JQuery的GET方式实现AJAX 4. JQuery的POST方式实现AJAX

通俗易懂理解到底什么是DevOps技术(Windows程序员视角)

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来聊聊到底什么是DevOps。 相信很多小伙伴为什么搞懂DevOps,已经不知道查了多少论坛的帖子和资料了,但还是很困惑的话,那不妨来看看我这个帖子。希望能有助于你的…