Ubuntu HDFS数据如何压缩
导读:Ubuntu上HDFS数据压缩实操指南 一 常用压缩格式与适用场景 Gzip:通用、压缩/解压速度中等、压缩率中等;适合一次性落地与归档。 Bzip2:压缩率高,但速度慢;适合对存储节省要求高、可接受较长处理时间的场景。 LZO:压缩率与...
Ubuntu上HDFS数据压缩实操指南
一 常用压缩格式与适用场景
- Gzip:通用、压缩/解压速度中等、压缩率中等;适合一次性落地与归档。
- Bzip2:压缩率高,但速度慢;适合对存储节省要求高、可接受较长处理时间的场景。
- LZO:压缩率与速度折中,支持索引以便较快随机访问(需额外索引/许可);适合频繁读取的大数据。
- Snappy:压缩/解压速度快,压缩率一般;适合高吞吐计算与交互式查询。
- Zstandard(Zstd):压缩率与速度兼顾,较新;适合在存储与性能间寻求平衡的场景。
二 前置检查与集群配置
- 在 core-site.xml 中注册需要的编解码器(确保集群节点均可用相应库):
<
configuration>
<
property>
<
name>
io.compression.codecs<
/name>
<
value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
org.apache.hadoop.io.compress.ZstdCodec
<
/value>
<
/property>
<
/configuration>
- 在 mapred-site.xml 中启用常用压缩(按需调整):
<
configuration>
<
!-- Map输出压缩 -->
<
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.SnappyCodec<
/value>
<
/property>
<
!-- Reduce输出压缩 -->
<
property>
<
name>
mapreduce.output.fileoutputformat.compress<
/name>
<
value>
true<
/value>
<
/property>
<
property>
<
name>
mapreduce.output.fileoutputformat.compress.codec<
/name>
<
value>
org.apache.hadoop.io.compress.SnappyCodec<
/value>
<
/property>
<
/configuration>
- 如使用 Gzip 并希望调整压缩级别,可在 core-site.xml 增加(可选):
<
property>
<
name>
io.compression.codec.gzip.level<
/name>
<
value>
6<
/value>
<
/property>
- 验证编解码器可用性(任一节点执行):
- 查看 Snappy:hadoop checknative -a | grep snappy
- 查看 Zstd:hadoop checknative -a | grep zstd
- 若无输出,需在集群各节点安装相应本地库(如 libsnappy、libzstd)并重启相关服务。
三 三种常用压缩方式
-
方式一 预压缩后上传
- 本地压缩并上传:
- Gzip:gzip input_file → hadoop fs -put input_file.gz /path/in/hdfs
- 读取:hadoop fs -cat /path/in/hdfs/input_file.gz | gunzip
- 说明:简单通用,Hadoop 读取常见压缩文件(如 Gzip/Bzip2/Snappy)时通常可自动解压;适合批处理与归档。
- 本地压缩并上传:
-
方式二 作业内启用压缩(MapReduce 示例)
- 在驱动中设置(示例为 Snappy):
Configuration conf = new Configuration();
conf.setBoolean("mapreduce.output.fileoutputformat.compress", true);
conf.set("mapreduce.output.fileoutputformat.compress.codec",
"org.apache.hadoop.io.compress.SnappyCodec");
Job job = Job.getInstance(conf);
// ... 其他作业配置
-
或在命令行提交作业时传入:
- hadoop jar your-job.jar YourMainClass
-D mapreduce.output.fileoutputformat.compress=true
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
-input /input -output /output
- hadoop jar your-job.jar YourMainClass
-
方式三 使用列式格式自带的压缩(推荐用于分析场景)
- Hive(ORC 使用 Snappy):
CREATE TABLE my_table (
id INT,
name STRING
)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");
- Spark(Parquet 使用 Snappy):
df.write
.mode("overwrite")
.option("compression", "snappy")
.parquet("/hdfs/path/to/dest")
- 说明:ORC/Parquet 原生支持压缩与谓词下推,通常比文本格式更高效。
四 小文件与存储优化
- 大量小文件会显著增加 NameNode 内存压力(每个块元数据常驻内存)。可用 HAR(Hadoop Archive) 归档合并:
- 归档:hadoop archive -archiveName myhar.har -p /user/ubuntu /user/my
- 查看:hdfs dfs -ls har:///user/my/myhar.har
- 解包:hdfs dfs -cp har:///user/my/my.har /user/your
- 列式格式(如 ORC/Parquet)配合压缩,可在保持查询性能的同时降低存储占用。
五 快速选择建议
- 追求写入/读取吞吐与通用性:选 Snappy(或 LZO,若需索引/更快随机访问)。
- 追求最高压缩率、可接受较慢速度:选 Bzip2(适合冷数据归档)。
- 通用归档与兼容性:选 Gzip。
- 在存储与性能间平衡且需更好压缩:选 Zstd(需集群具备相应本地库)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu HDFS数据如何压缩
本文地址: https://pptw.com/jishu/767232.html
