当前位置: 首页 > news >正文

[数据压缩] LZ4 压缩算法

0 序

  • 续接: [数据压缩/数据归档] 压缩算法综述 - 博客园/千千寰宇,展开研究 LZ4 压缩算法与压缩格式。

1 概述: LZ4 压缩算法

  • LZ4 是一种无损数据压缩算法,专注于极致的压缩和解压速度,同时保持合理的压缩比。它由 Yann Collet 于 2011 年开发,现在是开源社区广泛使用的压缩技术,尤其在大数据、实时计算和高性能存储场景中备受青睐。

LZ4 的核心优势是“速度优先”,在需要平衡压缩效率和处理延迟的场景中表现突出,尤其适合大数据、实时计算等对吞吐和响应时间要求极高的领域。

核心特点

  1. 超高速处理

    • 压缩速度可达 500 MB/s ~ 1 GB/s(单线程),解压速度更是高达 1 GB/s ~ 4 GB/s(取决于数据类型和硬件),是目前速度最快的压缩算法之一。
    • 设计上优化了 CPU 缓存利用,减少内存访问开销,适合对延迟敏感的场景。
  2. 合理的压缩比

    • 压缩比通常在 2:1 ~ 4:1(例如文本、日志数据),虽然不如 ZSTD 或 LZMA 等算法的压缩比高,但在速度上有绝对优势。
    • 支持不同压缩级别(1~12 级),级别越高压缩比略高,但速度会下降(默认级别 1 为速度优先)。
  3. 低内存占用

    • 压缩时内存占用极小(通常仅需几十 MB),适合嵌入式设备、分布式系统等资源受限场景。

适用场景

  • 实时计算:Flink、Spark 等流处理框架的状态存储(RocksDB 状态后端默认使用 LZ4)、Checkpoint 压缩。
  • 消息队列:Kafka 消息压缩(生产者压缩消息以减少网络传输,消费者快速解压)。
  • 分布式存储:HDFS、对象存储(如 S3)中的大文件压缩(配合 TAR 打包为 .tar.lz4)。
  • 日志/数据备份:实时日志压缩(如 ELK 生态中 Logstash 对日志的压缩传输)。
  • 缓存系统:Redis 等缓存中对大Value的压缩存储。

典型用法

  • 命令行压缩

    lz4 -z 源文件 压缩文件.lz4  # 压缩
    lz4 -d 压缩文件.lz4 解压文件  # 解压
    
  • 编程集成
    支持 C、C++、Java、Python、Go 等多种语言,例如 Java 中使用 lz4-java 库:

    byte[] input = "test data".getBytes();
    byte[] compressed = LZ4Factory.fastestInstance().compress(input);  // 快速压缩
    byte[] decompressed = LZ4Factory.fastestInstance().decompress(compressed);  // 解压
    

2 LZ4压缩算法的命令行工具

  • LZ4C是LZ4【压缩算法】对应的命令行工具(或旧版工具名称)**。

主要用于在终端中执行LZ4格式的压缩/解压操作**,具体说明如下:

  • LZ4C 的核心定位
  • LZ4C本质是LZ4算法的命令行实现工具

功能是将【文件/数据流】通过LZ4压缩算法压缩为.lz4格式,或解压.lz4文件。

以下是 LZ4(含LZ4C)常用命令清单,覆盖文件压缩、解压、数据流处理、性能优化等核心场景,适配 Linux/macOS 环境(Windows 可通过 WSLLZ4 官方二进制包使用):

基础命令(LZ4 与 LZ4C 通用)

功能 LZ4 命令(推荐) LZ4C 命令(旧版兼容) 说明
压缩文件 lz4 -z 源文件 目标文件.lz4 lz4c compress 源文件 目标文件.lz4 lz4 -z data.txt data.txt.lz4
解压文件 lz4 -d 源文件.lz4 目标文件 lz4c decompress 源文件.lz4 目标文件 lz4 -d data.txt.lz4 data.txt
压缩并覆盖目标文件 lz4 -zf 源文件 目标文件.lz4 lz4c compress -f 源文件 目标文件.lz4 若目标文件已存在,强制覆盖
解压并覆盖目标文件 lz4 -df 源文件.lz4 目标文件 lz4c decompress -f 源文件.lz4 目标文件 若目标文件已存在,强制覆盖
压缩目录(递归) lz4 -zr 源目录 目标目录.lz4 lz4c compress -r 源目录 目标目录.lz4 递归压缩目录内所有文件,生成单个压缩包
查看压缩包信息 lz4 -l 源文件.lz4 lz4c list 源文件.lz4 显示压缩比、原始大小、压缩后大小等
校验压缩包完整性 lz4 -t 源文件.lz4 lz4c test 源文件.lz4 检查压缩包是否损坏,无输出则为正常

高级用法(性能优化/大数据场景)

功能 命令示例 说明
调整压缩级别(速度/压缩比) lz4 -z -9 源文件 目标文件.lz4 -1(默认,最快)~-12(最慢,压缩比最高),大数据场景推荐 -3~-6(平衡速度)
快速压缩(极致速度) lz4 -z -1 源文件 目标文件.lz4 优先保证压缩速度,适合实时流数据(如 Kafka/Flink 中间数据)
管道压缩(大文件流式处理) `cat 大文件.bin lz4 -z > 大文件.bin.lz4`
管道解压(流式输出) `lz4 -d 大文件.bin.lz4 处理命令`
多线程压缩(LZ4 1.9.0+) lz4 -z -T4 源文件 目标文件.lz4 -T 指定线程数(如 -T4 用 4 线程),提升大文件压缩速度
分块压缩(适合 HDFS/分布式存储) lz4 -z -B64 源文件 目标文件.lz4 -B 指定分块大小(单位 KB,如 -B64=64KB),支持后续并行解压
保留原始文件权限 lz4 -z -p 源文件 目标文件.lz4 压缩后保留文件的读写权限、所有者信息

常用组合场景(大数据/日常办公)

1. 大数据场景:压缩 HDFS 上传文件

# 快速压缩日志文件(适合 Flume 采集后上传 HDFS)
lz4 -z -1 /data/logs/app.log /data/logs/app.log.lz4# 多线程压缩大文件(4 线程,分块 128KB,适合 Spark/Flink 输入文件)
lz4 -z -T4 -B128 /data/dataset.csv /data/dataset.csv.lz4

2. 日常场景:压缩/解压文件夹

# 递归压缩文件夹(生成 archive.lz4)
lz4 -zr /home/user/docs /backup/archive.lz4# 解压文件夹到指定目录
lz4 -dr /backup/archive.lz4 /home/user/restored_docs

3. 流式处理:实时压缩日志输出

# 实时压缩应用日志并写入文件(适合高吞吐日志场景)
tail -f /var/log/app.log | lz4 -z > /var/log/app.log.lz4

关键参数说明

参数 作用 适用场景
-z 压缩模式(默认,可省略) 所有压缩操作
-d 解压模式 所有解压操作
-f 强制覆盖目标文件 避免重复确认
-r 递归处理目录 文件夹压缩/解压
-l 显示压缩包详情 校验压缩效果
-t 校验压缩包完整性 传输后检查文件是否损坏
-1~-12 压缩级别(1=最快,12=最高压缩比) 实时场景用 -1,存储优化用 -6+
-T<num> 多线程数(如 -T8=8 线程) 大文件压缩(LZ4 1.9.0+ 支持)
-B<size> 分块大小(如 -B64=64KB) 分布式存储/并行解压
-p 保留文件权限 系统文件、配置文件压缩

注意事项

  1. LZ4C 兼容性:部分旧系统中 lz4clz4 的别名,功能完全一致;若提示 lz4c: command not found,直接替换为 lz4 即可。

  2. 压缩级别选择:大数据实时场景(如 Kafka 消息压缩、Flink 状态后端)优先用 -1(最快),离线存储场景(如 HDFS 冷数据)可用 -6~-9(平衡压缩比与速度)。

  3. 分块大小建议:分布式存储(HDFS/OSS)推荐分块大小 64KB~256KB,与大数据框架的块大小(如 HDFS 默认 128MB)匹配,提升并行处理效率。

LZ4 在大数据场景的实践

以下是 LZ4 在大数据场景的实践,覆盖 Flink 状态后端、Kafka 消息压缩、Hadoop 生态集成,包含配置示例和性能优化技巧。

1. 适用场景

  • 流处理任务状态存储(RocksDB 状态后端)
  • Checkpoint / Savepoint 压缩
# 1. 启用 RocksDB 状态后端
state.backend: rocksdb# 2. 开启状态压缩(默认 LZ4)
state.backend.rocksdb.compression: lz4# 3. 调整压缩级别(1=最快,默认;6=平衡;12=最高压缩比)
state.backend.rocksdb.compression.level: 3# 4. Checkpoint 压缩(可选,推荐 ZSTD,但若要统一用 LZ4)
execution.checkpointing.compression: lz4

3. 代码级配置(可选)

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 设置 RocksDB 状态后端并启用 LZ4 压缩
RocksDBStateBackend backend = new RocksDBStateBackend("hdfs:///flink/checkpoints");
backend.setCompressionType(CompressionType.LZ4);
backend.setCompressionLevel(3); // 对应命令行 -3
env.setStateBackend(backend);

4. 优化建议

  • 实时低延迟场景:压缩级别设为 1(最快),减少 CPU 开销
  • 高吞吐批处理场景:压缩级别设为 6,平衡压缩比和速度
  • 若状态较大,建议搭配 RocksDB 分区索引增量 Checkpoint

二、Kafka 消息 LZ4 压缩配置

1. 适用场景

  • 生产者压缩消息减少网络传输
  • 消费者解压(自动完成)

2. 生产者配置(producer.properties

# 启用 LZ4 压缩
compression.type: lz4# 批量发送阈值(配合压缩,默认 16384)
batch.size: 32768#  linger.ms 延长时间(默认 0,建议 5-10ms 积累数据)
linger.ms: 5

3. 消费者配置(无需额外压缩配置)

# 自动解压,无需手动设置
# 若需兼容其他压缩格式,可配置:
# compression.type: none (但不推荐)

4. 命令行示例

# 创建 LZ4 压缩的主题
kafka-topics.sh --create --topic lz4-test --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1# 生产者发送压缩消息(命令行)
kafka-console-producer.sh --topic lz4-test --bootstrap-server localhost:9092 --compression-codec lz4# 消费者接收消息(自动解压)
kafka-console-consumer.sh --topic lz4-test --bootstrap-server localhost:9092 --from-beginning

5. 性能对比

压缩算法 压缩比 压缩速度 解压速度 适合场景
LZ4 极快 极快 实时高吞吐
Snappy 极快 极快 通用实时
ZSTD 存储优化

三、Hadoop 生态 LZ4 集成

1. HDFS 文件 LZ4 压缩

配置(core-site.xml

<property><name>io.compression.codecs</name><value>org.apache.hadoop.io.compress.Lz4Codec</value>
</property>

命令行示例

# 压缩文件(生成 .lz4 后缀)
hadoop fs -Dmapreduce.output.fileoutputformat.compress=true \-Dmapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.Lz4Codec \-put local-file.txt /hdfs/path/# 解压文件
hadoop fs -text /hdfs/path/local-file.txt.lz4 | hadoop fs -put - /hdfs/path/uncompressed.txt

2. MapReduce 任务压缩

配置(mapred-site.xml

<property><name>mapreduce.map.output.compress</name><value>true</value>
</property>
<property><name>mapreduce.map.output.compress.codec</name><value>org.apache.hadoop.io.compress.Lz4Codec</value>
</property>

3. Hive 表 LZ4 压缩

-- 创建表时指定 LZ4 压缩
CREATE TABLE lz4_table (id INT,name STRING
)
STORED AS ORC
TBLPROPERTIES ('orc.compress'='LZ4'
);-- 插入数据(自动压缩)
INSERT INTO lz4_table SELECT id, name FROM source_table;

四、关键优化技巧

1. 压缩级别选择

场景类型 推荐级别 说明
实时流处理 1-3 优先保证速度
离线批处理 6-9 优先压缩比
存储密集型 9-12 冷数据归档

2. 分块大小调整

  • HDFS / 分布式存储:建议分块 64KB~256KB(与 LZ4 -B 参数匹配)
  • Kafka:消息批次大小建议 32KB~64KB(配合 batch.size

3. 硬件优化

  • LZ4 对 CPU 缓存友好,建议任务绑定 CPU 核心(如 Flink taskmanager.numberOfTaskSlots 匹配 CPU 核心数)
  • 避免在 HDD 上频繁随机读写压缩文件,优先用 SSD

五、常见问题排查

1. 压缩/解压速度慢

  • 检查 CPU 使用率(可能级别过高)
  • 降低压缩级别(如从 9→3)
  • 开启多线程(Flink RocksDB 自动支持,Kafka 2.0+ 支持多线程压缩)

2. 兼容性问题

  • 老版本 Hadoop(<2.6)需手动安装 LZ4 库:
    yum install lz4-devel
    
  • Flink 需确保依赖包存在:
    <dependency><groupId>org.apache.flink</groupId><artifactId>flink-statebackend-rocksdb_2.12</artifactId><version>${flink.version}</version>
    </dependency>
    

Y 推荐文献

  • Flink RocksDB 状态后端
  • Kafka 压缩配置
  • Hadoop LZ4 压缩

Y 推荐文献

  • [数据压缩/数据归档] 压缩算法综述 - 博客园/千千寰宇

  • LZ4 / LZ4C

  • https://github.com/lz4/lz4 (LZ4 官方 GitHub(命令行工具源码))
  • https://lz4.github.io/lz4/manual.html#CommandLineOptions (LZ4 命令行手册)
http://www.jsqmd.com/news/47952/

相关文章:

  • 什么是oracle的for engineered system版本
  • CAN通信数据帧与远程帧,标准格式与远程格式的区分
  • NumPy 从零开始:轻松掌握 Python 科学计算的“魔法”
  • Windows 内网部署共享Neko浏览器
  • iceberg sql怎样运用
  • Premium Multidiag TCS CDP+ V2021: Car Truck Diagnostic Tool with Bluetooth + Free Keygen
  • iceberg sql怎样使用
  • iceberg sql怎样优化
  • oracle的free版是什么版本?
  • `squares_np = x * x` 是不是向量的叉乘?
  • AcWing 905. 区间选点
  • 2025年11月热泵、电锅炉、中央空调推荐榜:商用、养殖、工建场景源头厂家选择指南
  • 上海春笋装饰深度测评报告:办公室商铺双场景装修全能首选,中小面积性价比之王
  • 我的改变的开始
  • Linux初级之定时任务
  • Hello-Agents 《从零开始构建智能体》 毕业设计 - yi
  • 模拟赛2
  • 2025热泵、电锅炉、中央空调怎么选?盛海空调,源头厂家,商用、养殖、工建场景行业标杆
  • 深入了解 Python 的 Pip:第三方包管理的利器 - 教程
  • 当世界要求你表演,选择真实是否一种罪?——《局外人》读后感
  • 实用指南:深度学习(2)神经元与需求预测
  • 2025 GODIAG GT100 PLUS GPT ENET DOIP OBD II Break Out Box 24V-12V ECU Connector for Auto Repair
  • 快速入门(不用指令),使用VSCode和Git管理代码和提交到远程服务器(GitHub) - 教程
  • 单部电梯调度程序三次题目集总结
  • Spring AI 代码分析(五)--RAG 分析
  • 详细介绍:一个实例用全创建型模式-优化(冗余消除)
  • 我的博客园美化记录
  • 2025家装木制品定制品牌怎么选?欧雅斯——楼梯、木门、衣柜、橱柜、护墙板,源头精品
  • 面向对象编程前三次大作业总结
  • iceberg sql怎么写