1. 首页 > Hadoop教程 > 正文

大数据教程FG037-Hive压缩与存储格式实战

内容简介:本文详细介绍Hive压缩与存储格式的核心概念与生产实战应用。风哥教程参考Hive官方文档File Formats、Compression等内容,涵盖TextFile、ORC、Parquet等主流存储格式的特点与使用场景,以及Snappy、Gzip、LZO等压缩算法的配置与优化,帮助读者掌握Hive数据存储优化的实战技巧。

目录大纲

Part01-基础概念与理论知识
  1.1 Hive存储格式概述
  1.2 压缩算法分类与特点
  1.3 存储格式与压缩的关系
Part02-生产环境规划与建议
  2.1 存储格式选型策略
  2.2 压缩算法选择建议
  2.3 性能与存储平衡
Part03-生产环境项目实施方案
  3.1 TextFile格式实战
  3.2 ORC格式实战
  3.3 Parquet格式实战
Part04-生产案例与实战讲解
  4.1 压缩格式转换案例
  4.2 存储优化案例
  4.3 查询性能对比案例
Part05-风哥经验总结与分享
  5.1 存储格式最佳实践
  5.2 常见问题与解决方案
  5.3 生产环境注意事项

Part01-基础概念与理论知识

1.1 Hive存储格式概述

Hive支持多种数据存储格式,不同的存储格式对查询性能和存储空间有显著影响。更多视频教程www.fgedu.net.cn

主要存储格式:

TextFile:默认格式,文本格式,可读性好,但存储效率低,不支持列式存储。

ORC:Optimized Row Columnar,Hive优化的列式存储格式,压缩比高,查询性能好。学习交流加群风哥微信: itpux-com

Parquet:Apache开源列式存储格式,与Spark生态兼容性好,支持复杂嵌套数据类型。

Avro:基于Schema的数据序列化格式,支持Schema演进,适合数据交换场景。

SequenceFile:Hadoop二进制文件格式,适合MapReduce处理。

1.2 压缩算法分类与特点

Hive支持多种压缩算法,不同算法在压缩比、压缩速度、可分割性方面各有特点:

压缩算法 压缩比 压缩速度 可分割 适用场景
Gzip 归档存储
Snappy 实时查询
LZO 实时查询
Zstd 通用场景
Bzip2 归档存储

风哥提示:选择压缩算法时要综合考虑压缩比、解压速度和可分割性。

1.3 存储格式与压缩的关系

存储格式和压缩是两个独立但相关的概念:

行式存储:按行存储数据,适合全行读取场景,如TextFile、SequenceFile。

列式存储:按列存储数据,适合列裁剪和聚合查询,如ORC、Parquet。

压缩方式:可以在存储格式基础上叠加压缩,进一步减少存储空间。

— 查看支持的压缩编解码器
SET io.compression.codecs;

— 查看ORC支持的压缩
SET hive.exec.orc.compression.strategy;

io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.SnappyCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.Lz4Codec,
org.apache.hadoop.io.compress.ZStandardCodec

hive.exec.orc.compression.strategy=SPEED

Part02-生产环境规划与建议

2.1 存储格式选型策略

存储格式选型需要根据业务场景和数据特点综合考虑:更多学习教程公众号风哥教程itpux_com

TextFile适用场景:

1. 数据加载阶段,需要快速导入数据
2. 数据需要与其他系统交换
3. 数据量较小,对性能要求不高

ORC适用场景:

1. Hive为主的数据仓库
2. 需要高压缩比和查询性能
3. 支持ACID事务
4. 单表数据量大,需要列裁剪优化

Parquet适用场景:

1. Spark为主的数据处理
2. 需要跨平台兼容性
3. 复杂嵌套数据结构
4. 多引擎查询场景

2.2 压缩算法选择建议

压缩算法选择建议:

实时查询场景:选择Snappy或LZO,压缩解压速度快,延迟低。

归档存储场景:选择Gzip或Zstd,压缩比高,节省存储空间。

混合场景:选择Zstd,兼顾压缩比和速度。

2.3 性能与存储平衡

在性能与存储之间找到平衡点:

— 生产环境推荐配置
— ORC格式 + Snappy压缩
SET hive.default.fileformat=ORC;
SET hive.exec.orc.compression.codec=SNAPPY;

— Parquet格式 + Snappy压缩
SET hive.default.fileformat=Parquet;
SET parquet.compression=SNAPPY;

— 中间结果压缩
SET hive.exec.compress.intermediate=true;
SET mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

— 最终输出压缩
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

Part03-生产环境项目实施方案

3.1 TextFile格式实战

TextFile是Hive默认存储格式,适合数据导入导出场景。from bigdata视频:www.itpux.com

3.1.1 创建TextFile表

— 创建TextFile格式表
CREATE TABLE fgedu_text_table (
  id INT,
  name STRING,
  age INT,
  salary DECIMAL(10,2),
  create_time TIMESTAMP
) ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ‘,’
  LINES TERMINATED BY ‘\n’
STORED AS TEXTFILE;

— 启用Gzip压缩
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

— 插入数据
INSERT INTO TABLE fgedu_text_table
SELECT id, name, age, salary, create_time
FROM fgedu_source_table;

# 创建表成功
OK
Time taken: 0.234 seconds

# 插入数据
Query ID = root_20240119170000_xxxx
Total jobs = 1
Launching Job 1 out of 1

Loading data to table default.fgedu_text_table
OK
Time taken: 15.678 seconds

3.1.2 TextFile压缩配置

— 查看文件大小
hdfs dfs -du -h /user/hive/warehouse/fgedu_text_table;

— 不压缩的TextFile
-rw-r–r– 3 root supergroup 256.0 M 2024-01-19 17:00 /user/hive/warehouse/fgedu_text_table/000000_0

— Gzip压缩后的TextFile
-rw-r–r– 3 root supergroup 64.0 M 2024-01-19 17:01 /user/hive/warehouse/fgedu_text_table/000000_0.gz

3.2 ORC格式实战

ORC是Hive推荐的列式存储格式,具有高压缩比和查询性能优势。学习交流加群风哥QQ113257174

3.2.1 创建ORC表

— 创建ORC格式表
CREATE TABLE fgedu_orc_table (
  id INT,
  name STRING,
  age INT,
  salary DECIMAL(10,2),
  create_time TIMESTAMP
) STORED AS ORC
TBLPROPERTIES (
  “orc.compress”=”SNAPPY”,
  “orc.create.index”=”true”,
  “orc.stripe.size”=”268435456”,
  “orc.row.index.stride”=”10000”
);

— 插入数据
INSERT INTO TABLE fgedu_orc_table
SELECT * FROM fgedu_source_table;

# 创建ORC表
OK
Time taken: 0.156 seconds

# 插入数据
Query ID = root_20240119170500_xxxx
Total jobs = 1
Launching Job 1 out of 1

Loading data to table default.fgedu_orc_table
Table default.fgedu_orc_table stats: [numFiles=1, numRows=1000000, totalSize=45678901, rawDataSize=256000000]
OK
Time taken: 25.678 seconds

3.2.2 ORC表属性优化

— ORC表关键属性说明
— orc.compress: 压缩算法 (NONE, SNAPPY, ZLIB, LZ4, ZSTD)
— orc.create.index: 是否创建索引
— orc.stripe.size: 条带大小,默认256MB
— orc.row.index.stride: 行索引步长

— 查看ORC文件信息
hive –orcfiledump /user/hive/warehouse/fgedu_orc_table/000000_0;

# ORC文件信息
Structure for /user/hive/warehouse/fgedu_orc_table/000000_0
File Version: 0.12 with ORC_517
Rows: 1000000
Compression: SNAPPY
Compression size: 262144
Type: struct<id:int,name:string,age:int,salary:decimal(10,2),create_time:timestamp>

Stripe Statistics:
  Stripe 1:
    Column 0: count: 1000000
    Column 1: count: 1000000 min: 1 max: 1000000
    Column 2: count: 1000000 min: AAAAA max: ZZZZZ

File Statistics:
  Column 0: count: 1000000
  Column 1: count: 1000000 min: 1 max: 1000000

Stripes:
  Stripe: offset: 3 data: 45678901 rows: 1000000 tail: 123 index: 456

File length: 45679000 bytes

3.3 Parquet格式实战

Parquet是Spark生态推荐的列式存储格式,跨平台兼容性好。

3.3.1 创建Parquet表

— 创建Parquet格式表
CREATE TABLE fgedu_parquet_table (
  id INT,
  name STRING,
  age INT,
  salary DECIMAL(10,2),
  create_time TIMESTAMP
) STORED AS PARQUET
TBLPROPERTIES (
  “parquet.compression”=”SNAPPY”,
  “parquet.block.size”=”268435456”,
  “parquet.page.size”=”1048576”
);

— 插入数据
INSERT INTO TABLE fgedu_parquet_table
SELECT * FROM fgedu_source_table;

# 创建Parquet表
OK
Time taken: 0.145 seconds

# 插入数据
Query ID = root_20240119171000_xxxx
Total jobs = 1

Loading data to table default.fgedu_parquet_table
Table default.fgedu_parquet_table stats: [numFiles=1, numRows=1000000, totalSize=47890123, rawDataSize=256000000]
OK
Time taken: 28.456 seconds

3.3.2 Parquet表Schema演进

— Parquet支持Schema演进
— 添加新列
ALTER TABLE fgedu_parquet_table ADD COLUMNS (
  department STRING COMMENT ‘部门’,
  level STRING COMMENT ‘级别’
);

— 查看表结构
DESCRIBE fgedu_parquet_table;

# 添加列成功
OK
Time taken: 0.123 seconds

# 表结构
+————-+—————+———-+
| col_name | data_type | comment |
+————-+—————+———-+
| id | int | |
| name | string | |
| age | int | |
| salary | decimal(10,2) | |
| create_time | timestamp | |
| department | string | 部门 |
| level | string | 级别 |
+————-+—————+———-+

Part04-生产案例与实战讲解

4.1 压缩格式转换案例

本案例演示将TextFile格式转换为ORC格式,实现存储优化。更多视频教程www.fgedu.net.cn

#!/bin/bash
# format_conversion.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “=== 格式转换 ===”
echo “Date: $(date)”

hive -e “
— 创建ORC目标表
CREATE TABLE IF NOT EXISTS fgedu_sales_orc (
  sale_id STRING,
  product_id STRING,
  product_name STRING,
  category STRING,
  sale_date DATE,
  amount DECIMAL(12,2),
  quantity INT
) STORED AS ORC
TBLPROPERTIES (
  ‘orc.compress’=’SNAPPY’,
  ‘orc.create.index’=’true’
);

— 从TextFile转换
INSERT OVERWRITE TABLE fgedu_sales_orc
SELECT * FROM fgedu_sales_text;

— 对比存储大小
— TextFile: 1.2GB
— ORC+Snappy: 180MB

echo “=== 转换完成 ===”

=== 格式转换 ===
Date: Fri Jan 19 17:15:00 CST 2024

# 创建ORC表
OK
Time taken: 0.234 seconds

# 数据转换
Query ID = root_20240119171500_xxxx
Total jobs = 1
Launching Job 1 out of 1

Loading data to table default.fgedu_sales_orc
Table default.fgedu_sales_orc stats: [numFiles=4, numRows=5000000, totalSize=188765432, rawDataSize=1250000000]
OK
Time taken: 156.789 seconds

# 存储对比
TextFile: 1.2 GB
ORC+Snappy: 180 MB
压缩比: 6.7:1

=== 转换完成 ===

4.2 存储优化案例

通过合理的存储格式和压缩配置,实现存储和查询的双重优化。学习交流加群风哥微信: itpux-com

— 创建分区ORC表
CREATE TABLE fgedu_orders_optimized (
  order_id STRING,
  user_id STRING,
  product_id STRING,
  order_amount DECIMAL(12,2),
  order_status STRING
) PARTITIONED BY (dt STRING, hour STRING)
STORED AS ORC
TBLPROPERTIES (
  ‘orc.compress’=’ZSTD’,
  ‘orc.compress.level’=’3’,
  ‘orc.create.index’=’true’,
  ‘orc.bloom.filter.columns’=’order_id,user_id’
);

— 启用动态分区
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

— 插入数据
INSERT OVERWRITE TABLE fgedu_orders_optimized PARTITION(dt, hour)
SELECT
  order_id, user_id, product_id, order_amount, order_status,
  DATE_FORMAT(order_time, ‘yyyy-MM-dd’) AS dt,
  DATE_FORMAT(order_time, ‘HH’) AS hour
FROM fgedu_orders_source;

# 创建优化表
OK
Time taken: 0.345 seconds

# 数据加载
Query ID = root_20240119172000_xxxx
Total jobs = 1

Loading partitions {dt=2024-01-19, hour=00}, {dt=2024-01-19, hour=01}, …
Loading data to table default.fgedu_orders_optimized

Partition default.fgedu_orders_optimized{dt=2024-01-19, hour=00} stats: [numFiles=1, numRows=125000, totalSize=4567890]
Partition default.fgedu_orders_optimized{dt=2024-01-19, hour=01} stats: [numFiles=1, numRows=118000, totalSize=4321098]

OK
Time taken: 234.567 seconds

4.3 查询性能对比案例

对比不同存储格式的查询性能差异。风哥提示:列式存储在列裁剪场景下性能优势明显。

— 准备测试数据
CREATE TABLE fgedu_perf_text STORED AS TEXTFILE AS
SELECT * FROM fgedu_source_table;

CREATE TABLE fgedu_perf_orc STORED AS ORC TBLPROPERTIES (‘orc.compress’=’SNAPPY’) AS
SELECT * FROM fgedu_source_table;

CREATE TABLE fgedu_perf_parquet STORED AS PARQUET TBLPROPERTIES (‘parquet.compression’=’SNAPPY’) AS
SELECT * FROM fgedu_source_table;

— 性能测试:单列聚合
— TextFile
SELECT category, COUNT(*), AVG(amount) FROM fgedu_perf_text GROUP BY category;

— ORC
SELECT category, COUNT(*), AVG(amount) FROM fgedu_perf_orc GROUP BY category;

— Parquet
SELECT category, COUNT(*), AVG(amount) FROM fgedu_perf_parquet GROUP BY category;

# 数据准备完成
fgedu_perf_text: 1.2 GB
fgedu_perf_orc: 180 MB
fgedu_perf_parquet: 195 MB

# 性能测试结果
TextFile查询时间: 45.67 秒
ORC查询时间: 12.34 秒
Parquet查询时间: 14.56 秒

# 性能提升
ORC vs TextFile: 73% 提升
Parquet vs TextFile: 68% 提升

Part05-风哥经验总结与分享

5.1 存储格式最佳实践

风哥在生产环境中的存储格式选型经验:from bigdata视频:www.itpux.com

1. ODS层:使用TextFile或Parquet,便于数据加载和跨平台交换。

2. DWD层:使用ORC或Parquet,启用压缩,提高查询效率。

3. DWS层:使用ORC,启用索引和布隆过滤器,优化聚合查询。

4. ADS层:根据查询引擎选择,Hive用ORC,Spark用Parquet。

5.2 常见问题与解决方案

问题1:小文件过多

解决方案:使用合并策略,定期合并小文件。

— 合并小文件
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=256000000;
SET hive.merge.smallfiles.avgsize=16000000;

问题2:压缩文件不可分割

解决方案:使用支持分割的压缩格式(Snappy、LZO),或控制文件大小。学习交流加群风哥QQ113257174

5.3 生产环境注意事项

1. 压缩兼容性:确保集群安装了对应的压缩编解码器。

2. 内存配置:列式存储需要更多内存处理,适当增加Executor内存。

3. 索引维护:ORC索引会占用额外空间,根据查询模式决定是否启用。

— 检查压缩支持
hadoop checknative -a;

— 内存配置建议
SET hive.exec.reducers.bytes.per.reducer=256000000;
SET mapreduce.map.memory.mb=4096;
SET mapreduce.reduce.memory.mb=8192;

# 压缩支持检查
Native library checking:
hadoop: true /bigdata/app/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /lib64/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
zstd: true /lib64/libzstd.so.1

风哥提示:存储格式和压缩的选择直接影响Hive的查询性能和存储成本。在生产环境中,建议根据数据层次和查询模式选择合适的存储格式,并配合压缩算法实现存储和性能的最优平衡。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息