内容简介:本文详细介绍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;
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表
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表
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;
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.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;
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表
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;
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演进
— 添加新列
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
# 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
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
