如何通过Ubuntu HDFS实现数据压缩,大幅提升存储效率?
- 内容介绍
- 文章标签
- 相关推荐
公司常面临以下痛点:
- 海量日志、图片、视频等文件迅速占满磁盘,导致存储成本飙升。
- 磁盘 I/O 成为程序瓶颈,影响批处理与实时分析的时效性。
- 跨节点的数据传输耗时长,带宽被大量未压缩的数据浪费。
如果能够在 HDFS 层面实现数据压缩,明显提高存储效率?" src="/img02/1155719608,3353620582&fm=253&app=138&f=jpg"/>
一、常用压缩算法及适用场景
| 算法 | 压缩率 | 压缩/解压速度 | 典型使用场景 |
|---|---|---|---|
| Snappy | 中等 | 极快 | 实时流处理、日志写入 |
| Gzip | 高 | 慢 | 离线批处理、归档备份 |
| LZO | 中等 | 快 | 大文件快速压缩、MapReduce 中间结果 |
| Zstd | 高且可调节 | 快‑极快 | 兼顾高压缩率与性能的新一代方案 |
二、在 Ubuntu 上准备 Hadoop 与压缩 Codec 包
# 更新程序软件源
sudo apt update
# 安装 Hadoop 主要组件
sudo apt install -y hadoop-common hadoop-hdfs
# 安装常用压缩编解码器
sudo apt install -y hadoop-hdfs-compression-codecs
# 如需额外的 Zstd 支持。可手动下载对应 JAR 包放入 $HADOOP_HOME/share/hadoop/tools/lib/
验证 Codec 是否可用
# 列出已加载的 Codec
hadoop classpath | tr ':' '
' | grep -i codec
# 期待看到:snappy-java-*.jar、lzo-*.jar、zstd-*.jar 等
3. 配置 HDFS 压缩参数
打开 Hadoop 配置目录下的 $HADOOP_CONF_DIR/hdfs-site.xml加入以下关键属性:
dfs.compress.blocksize
134217728
块级别压缩大小
dfs.datanode.use.deduplication
true
开启块去重,可进一步节约空间
dfs.datanode.deduplication.key.size
128
去重键大小,依据磁盘容量自行调整
4. 设置默认压缩编解码器
在 $HADOOP_CONF_DIR/core-site.xml 中配置全局默认 codec,这样所有未显式指定的写操作都会自动走该 codec。
io.compression.codec
org.apache.hadoop.io.compress.SnappyCodec
&,&,&,&,&,&,&,&,&,&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&lify
5 . 使用不同编解码器写入数据
当你通过命令行或 API 写入文件时可以覆盖全局默认codec,实现灵活选择。
# 使用 Snappy
hadoop fs -put local_file.txt /data/compressed/snappy/
# 使用 Gzip
hadoop fs -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
-put local_file.txt /data/compressed/gzip/
# 使用 Zstd
hadoop fs -D mapred.output.compression.codec=org.apache.hadoop.io.compress.ZStandardCodec \
-put local_file.txt /data/compressed/zstd/
6 . 验证压缩效果
# 列出文件信息。包括实际占用空间
hadoop fs -ls -du /data/compressed/
# 对比原始文件大小和压缩后大小
orig=$
comp=$
echo "原始: $orig bytes 压缩后: $comp bytes 压缩率: $"
若显示占用空间明显下降,即表明已成功完成压缩。可以进一步使用 -cat -gzip ... | gzip -d | wc -c 检查解压后的完整性。
7 . 常见痛点对应方法
- 存储成本失控 启用块去重 + 高效算法,单个块可节省 40%~60% 磁盘。
- MapReduce 作业慢 对中间结果使用 LZO 或 Snappy,降低 I/O 耗时约 30%~50%。话说回来,
- 带宽被占满 跨节点复制时自动走压缩流。传输数据量相应下降,同等带宽下作业完成时间明显加速。
- 运维维护复杂度高 统一在 core‑site.xml 配置默认 Codec;业务方只需关注业务逻辑,无需每次手动指定。
- 数据恢复困难 所有官方 Codec 都提供成熟的 Java 解码实现。只要保留对应 JAR,即可无缝恢复。
8 . 性能调优小技巧
- 块大小匹配算法特性:Snappy 在小块 时表现最佳;怎么说呢,Zstd 在大块 时能获得更高比率。根据业务选择合适块大小,
- 并行度:在写入大量小文件时可开启 Hadoop 的 “mapreduce.output.fileoutputformat.compress.type=BLOCK” 来让每个 Mapper 并行完成压缩。
-
JVM 参数:若使用 Snappy,需要确保 native lib 已加载;推荐添加
-Djava.library.path=$HADOOP_HOME/lib/native/$OS_ARCH/$LIB_ARCH/$CPU_ARCH ` 到 HADOOP_OPTS 中。 - 磁盘预留:开启 deduplication 后需要额外预留约 10% 的元数据空间用于索引,否则可能出现 “OutOfMemoryError”。
结论与接下来行动计划 💡
:
- 在测试环境先跑一次全量基准测试,对比开启前后的磁盘占用与作业耗时。
- 挑选最适合业务的 Codec 并固化到 production 配置中。
- 定期审计 HDFS 使用情况,结合 deduplication 报表进行容量规划。
- 将 Zstd 与 Parquet/ORC 列式存储结合,实现更进一步的查询性能提高。
I'll rewrite final answer accordingly.
- 海量日志、图片、视频等文件迅速占满磁盘,导致存储成本飙升。
- 磁盘 I/O 成为程序瓶颈,影响批处理与实时分析的时效性。不过,
- 跨节点的数据传输耗时长。带宽被大量未压缩的数据浪费。
If you can compress data at HDFS layer,you can significantly reduce storage costs,speed up data reads。and alleviate network pressure. Below is a step‑by‑step guide on how to achieve data compression on Ubuntu with HDFS.
| 算法 | 压缩率 | 速度 典型使用场景 |
|---|---|---|
| Snappy |
Oops re is messed up html due to earlier editing!Let's reconstruct correctly.
We need proper table rows with correct markup.
We'll rewrite table cleanly:
| 算法 | 压縮率 | 壓縮/解壓速度 | 典型使用場景 |
|---|---|---|---|
| Snappy | 30%
Let's just produce clean html now from scratch.
If you compress data directly in HDFS you can:
--- END --- |
公司常面临以下痛点:
- 海量日志、图片、视频等文件迅速占满磁盘,导致存储成本飙升。
- 磁盘 I/O 成为程序瓶颈,影响批处理与实时分析的时效性。
- 跨节点的数据传输耗时长,带宽被大量未压缩的数据浪费。
如果能够在 HDFS 层面实现数据压缩,明显提高存储效率?" src="/img02/1155719608,3353620582&fm=253&app=138&f=jpg"/>
一、常用压缩算法及适用场景
| 算法 | 压缩率 | 压缩/解压速度 | 典型使用场景 |
|---|---|---|---|
| Snappy | 中等 | 极快 | 实时流处理、日志写入 |
| Gzip | 高 | 慢 | 离线批处理、归档备份 |
| LZO | 中等 | 快 | 大文件快速压缩、MapReduce 中间结果 |
| Zstd | 高且可调节 | 快‑极快 | 兼顾高压缩率与性能的新一代方案 |
二、在 Ubuntu 上准备 Hadoop 与压缩 Codec 包
# 更新程序软件源
sudo apt update
# 安装 Hadoop 主要组件
sudo apt install -y hadoop-common hadoop-hdfs
# 安装常用压缩编解码器
sudo apt install -y hadoop-hdfs-compression-codecs
# 如需额外的 Zstd 支持。可手动下载对应 JAR 包放入 $HADOOP_HOME/share/hadoop/tools/lib/
验证 Codec 是否可用
# 列出已加载的 Codec
hadoop classpath | tr ':' '
' | grep -i codec
# 期待看到:snappy-java-*.jar、lzo-*.jar、zstd-*.jar 等
3. 配置 HDFS 压缩参数
打开 Hadoop 配置目录下的 $HADOOP_CONF_DIR/hdfs-site.xml加入以下关键属性:
dfs.compress.blocksize
134217728
块级别压缩大小
dfs.datanode.use.deduplication
true
开启块去重,可进一步节约空间
dfs.datanode.deduplication.key.size
128
去重键大小,依据磁盘容量自行调整
4. 设置默认压缩编解码器
在 $HADOOP_CONF_DIR/core-site.xml 中配置全局默认 codec,这样所有未显式指定的写操作都会自动走该 codec。
io.compression.codec
org.apache.hadoop.io.compress.SnappyCodec
&,&,&,&,&,&,&,&,&,&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&aacompact and fast default codec&lify
5 . 使用不同编解码器写入数据
当你通过命令行或 API 写入文件时可以覆盖全局默认codec,实现灵活选择。
# 使用 Snappy
hadoop fs -put local_file.txt /data/compressed/snappy/
# 使用 Gzip
hadoop fs -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
-put local_file.txt /data/compressed/gzip/
# 使用 Zstd
hadoop fs -D mapred.output.compression.codec=org.apache.hadoop.io.compress.ZStandardCodec \
-put local_file.txt /data/compressed/zstd/
6 . 验证压缩效果
# 列出文件信息。包括实际占用空间
hadoop fs -ls -du /data/compressed/
# 对比原始文件大小和压缩后大小
orig=$
comp=$
echo "原始: $orig bytes 压缩后: $comp bytes 压缩率: $"
若显示占用空间明显下降,即表明已成功完成压缩。可以进一步使用 -cat -gzip ... | gzip -d | wc -c 检查解压后的完整性。
7 . 常见痛点对应方法
- 存储成本失控 启用块去重 + 高效算法,单个块可节省 40%~60% 磁盘。
- MapReduce 作业慢 对中间结果使用 LZO 或 Snappy,降低 I/O 耗时约 30%~50%。话说回来,
- 带宽被占满 跨节点复制时自动走压缩流。传输数据量相应下降,同等带宽下作业完成时间明显加速。
- 运维维护复杂度高 统一在 core‑site.xml 配置默认 Codec;业务方只需关注业务逻辑,无需每次手动指定。
- 数据恢复困难 所有官方 Codec 都提供成熟的 Java 解码实现。只要保留对应 JAR,即可无缝恢复。
8 . 性能调优小技巧
- 块大小匹配算法特性:Snappy 在小块 时表现最佳;怎么说呢,Zstd 在大块 时能获得更高比率。根据业务选择合适块大小,
- 并行度:在写入大量小文件时可开启 Hadoop 的 “mapreduce.output.fileoutputformat.compress.type=BLOCK” 来让每个 Mapper 并行完成压缩。
-
JVM 参数:若使用 Snappy,需要确保 native lib 已加载;推荐添加
-Djava.library.path=$HADOOP_HOME/lib/native/$OS_ARCH/$LIB_ARCH/$CPU_ARCH ` 到 HADOOP_OPTS 中。 - 磁盘预留:开启 deduplication 后需要额外预留约 10% 的元数据空间用于索引,否则可能出现 “OutOfMemoryError”。
结论与接下来行动计划 💡
:
- 在测试环境先跑一次全量基准测试,对比开启前后的磁盘占用与作业耗时。
- 挑选最适合业务的 Codec 并固化到 production 配置中。
- 定期审计 HDFS 使用情况,结合 deduplication 报表进行容量规划。
- 将 Zstd 与 Parquet/ORC 列式存储结合,实现更进一步的查询性能提高。
I'll rewrite final answer accordingly.
- 海量日志、图片、视频等文件迅速占满磁盘,导致存储成本飙升。
- 磁盘 I/O 成为程序瓶颈,影响批处理与实时分析的时效性。不过,
- 跨节点的数据传输耗时长。带宽被大量未压缩的数据浪费。
If you can compress data at HDFS layer,you can significantly reduce storage costs,speed up data reads。and alleviate network pressure. Below is a step‑by‑step guide on how to achieve data compression on Ubuntu with HDFS.
| 算法 | 压缩率 | 速度 典型使用场景 |
|---|---|---|
| Snappy |
Oops re is messed up html due to earlier editing!Let's reconstruct correctly.
We need proper table rows with correct markup.
We'll rewrite table cleanly:
| 算法 | 压縮率 | 壓縮/解壓速度 | 典型使用場景 |
|---|---|---|---|
| Snappy | 30%
Let's just produce clean html now from scratch.
If you compress data directly in HDFS you can:
--- END --- |

