在 Hadoop 生态中,“数据库压缩与解压”通常指 HDFS 存储压缩 和 计算组件(如 Hive、HBase、Spark)中的数据压缩。Hadoop 本身不是传统关系型数据库,而是分布式存储与计算框架,因此“压缩”更多体现在文件层面和计算过程中的数据交换层面。
下面系统说明 Hadoop 中数据压缩与解压的实现方式。
Hadoop 支持多种压缩算法,常见如下:
| 压缩格式 | 是否可切分 | 压缩率 | 压缩/解压速度 | 典型用途 |
|---|---|---|---|---|
| Gzip | 否 | 高 | 中 | 普通文件存储 |
| Bzip2 | ✅ | 很高 | 慢 | 归档数据 |
| LZO | ✅(需索引) | 中 | 快 | 大文件、MapReduce |
| Snappy | 否 | 中 | 非常快 | 中间数据、HBase |
| Zstandard (Zstd) | 否 | 高 | 快 | Hive、Spark(新版支持) |
✅ 可切分:压缩后文件可被多个 Map Task 并行读取
在 MapReduce / Hive / Spark 中写入 HDFS 时,可直接指定压缩格式。
Configuration conf = new Configuration();
conf.setBoolean("mapreduce.output.fileoutputformat.compress", true);
conf.set("mapreduce.output.fileoutputformat.compress.codec",
"org.apache.hadoop.io.compress.GzipCodec");
生成的 HDFS 文件:
/output/part-r-00000.gz
CREATE TABLE user_info (
id BIGINT,
name STRING
)
STORED AS ORC
TBLPROPERTIES (
"orc.compress"="SNAPPY"
);
✅ 写入时自动压缩
✅ 查询时自动解压
SET hive.exec.compress.intermediate=true;
SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
spark.conf.set("spark.sql.parquet.compression.codec", "snappy")
RDD 输出压缩:
rdd.saveAsTextFile(
"hdfs:///output",
classOf[org.apache.hadoop.io.compress.GzipCodec]
)
HBase 是 Hadoop 生态中的“数据库”,压缩在列族级别配置。
create 'user',
{NAME => 'info', COMPRESSION => 'SNAPPY'}
支持的压缩:
NONEGZSNAPPYLZOZSTDalter 'user', {NAME => 'info', COMPRESSION => 'SNAPPY'}
major_compact 'user'
✅ HBase 自动完成压缩与解压
✅ 对客户端透明
gzip data.txt
hdfs dfs -get /input/data.txt.gz .
gunzip data.txt.gz
或:
hadoop fs -cat /input/data.txt.gz | gunzip
| 场景 | 是否自动解压 |
|---|---|
| Hive 表 | ✅ |
| HBase | ✅ |
| Spark 读取 | ✅ |
| MapReduce | ✅ |
| HDFS 原始文件 | ❌(需程序支持) |
➡ 使用了不可切分压缩(如 Gzip)+ 大文件
➡ 忘了执行 major_compact
➡ 缺少 native 库,需安装 snappy-native
如果你愿意,我可以:
只要告诉我你使用的是 Hive / HBase / Spark / MapReduce 哪一种即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。