Hive的几种常见存储格式的读写查询性能测试

本文通过对Hive中不同存储格式(ORC、Parquet、RCfile、Sequencefile、Avro)的性能测试,对比了它们在数据压缩、存储时间和SQL查询响应速度上的表现,最终推荐在实际应用中采用ORC或Parquet格式。

一.测试背景

工作中想把历史的APP日志结构化到Hive中进行查询,由于数据较大,需要进行压缩,根据Hive官方提供的几种存储格式分别进行写入,读取,OLAP计算的性能测试,以求找到最好的压缩格式。

 

二.测试方法概述
 

数据来源:采用生产上数据抽样,大小为100G。原始日志格式为textfile文件(标准JSON)。
测试平台:公司Ambari测试平台,物理内存100G。
测试方法:将textfile文件通过脚本自动录入到Hive里,形成大表。(注:解析JSON数据的serde使用 hdp hive自带的hive-hcatalog-core.jar 里面的org.apache.hive.hcatalog.data.JsonSerDe类)
从大表创建基于各种不同存储方式的分区表。
核心组件HDP版本选择

三.实际操作

1.建立大表js_data

CREATE TABLE IF NOT EXISTS data_ysz.js_data (referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING,visitDate STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';

2.装载数据到js_data

load data inpath '' into table js_data 

3.根据大表建立不同存储方式的分区表(依次为RCfile,ORC,sequencefile,parquet,Avro)

Create table js_data_partitioned_rcfile(referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING) PARTITIONED BY (visitDate STRING) STORED AS RCfile
Create table js_data_partitioned_orc(referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING)PARTITIONED BY (visitDate STRING) STORED AS ORC
Create table js_data_partitioned_sequencefile(referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING) PARTITIONED BY (visitDate STRING) STORED AS SequenceFile
Create table js_data_partitioned_parquetfile(referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING) PARTITIONED BY (visitDate STRING) STORED AS parquetfile
Create table js_data_partitioned_avrofile(referer STRING,ip STRING,articleId STRING,catalogCode STRING,userAgent STRING,sessionId STRING,title STRING,deviceId STRING,url STRING,visitTime STRING,catalogId STRING,atype STRING,domain STRING,action STRING) PARTITIONED BY (visitDate STRING) STORED AS Avro

4.基于如下SQL进行测试

select visitdate,count(*) as pv from 表名 where action = '1'  and domain = 'static.scms.sztv.com.cn' group by visitdate order by pv;

 

四.结果数据统计

性能测试结果
存储格式              ORC    Sequencefile    Parquet      RCfile     Avro
数据压缩后大小    1.8G        67.0G               11G        63.8G    66.7G
存储耗费时间       535.7s      625.8s           537.3s      543.48    544.3
SQL查询响应速度 19.63s    184.07s          24.22s       88.5s    281.65s
 

五.结论


1.在压缩存储时间上,除Sequencefile外基本都相差无几。

2.数据压缩比例上ORC最优,相比textfile节省了50倍磁盘空间,parquet压缩性能也较好。

3.SQL查询速度而言,ORC与parquet性能较好,远超其余存储格式。

综合上述各种性能指标,建议工作中原始日志写入hive的存储格式都采用ORC或者parquet格式,这和目前主流的做法一致。

 

### Hive调优时存储格式的选择 在Hive调优过程中,选择合适的存储格式能够显著提升查询性能和降低存储成本。以下是几种常见存储格式及其特点: #### 1. **TextFile** - **特性**: 默认存储格式,行存储方式,每行以`\n`结束[^3]。 - **优点**: 简单易用,兼容性强,适合小规模数据集或调试场景。 - **缺点**: 数据未压缩时占用大量磁盘空间;解析开销较高。 #### 2. **SequenceFile** - **特性**: Hadoop API 提供的一种二进制文件格式,支持三种压缩选项:NONE、RECORD 和 BLOCK[^3]。 - **优点**: 支持高效压缩,尤其推荐使用 BLOCK 压缩以获得更好的性能。 - **适用场景**: 中小型数据集,需兼顾压缩与可扩展性的场合。 #### 3. **RCFile (Record Columnar File)** - **特性**: 结合了行存储和列存储的优点,按行分块后再进行列式存储[^3]。 - **优点**: 减少存储空间需求,一定程度上提升了查询性能。 - **局限性**: 性能改进有限,已被更先进的 ORC 替代。 #### 4. **ORC (Optimized Row Columnar)** - **特性**: RCFile 的升级版本,提供更高的压缩比和更快的查询速度[^3]。 - **优势**: - 自动为每一列生成索引,加速过滤条件下的查询。 - 更高效的压缩算法(如 Snappy),减少 I/O 成本。 - **最佳实践**: 推荐用于大规模数据分析任务,尤其是涉及复杂查询的情况。 #### 5. **Parquet** - **特性**: 列式存储格式,广泛应用于大数据生态系统中[^3]。 - **亮点**: - 高效处理特定列上的扫描操作。 - 默认采用 Snappy 压缩,也可切换至 Gzip 获取更高压缩率。 - 完全支持 Impala 查询引擎。 - **应用场景**: 复杂报表生成、ETL 流程以及需要频繁访问部分字段的大表。 --- ### Hive建表的最佳实践 为了实现高性能的 Hive 表结构设计,应遵循以下原则: #### 1. **合理选择存储格式** 优先考虑 `ORC` 或 `Parquet` 文件格式,因其具备优秀的压缩能力和快速检索能力[^3]。 ```sql CREATE TABLE example_table ( id INT, name STRING, value DOUBLE ) STORED AS ORC; ``` #### 2. **启用压缩机制** 通过设置适当的压缩编码进一步缩减物理存储体积,从而加快读写速率[^4]。 ```sql SET hive.exec.compress.output=true; SET mapreduce.output.fileoutputformat.compress=true; SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; ``` #### 3. **利用分区技术** 针对高频率筛选维度实施水平拆分策略,大幅削减不必要的数据加载范围[^1]。 ```sql CREATE TABLE sales_data ( order_id BIGINT, product_name STRING, amount DECIMAL(10,2) ) PARTITIONED BY (year INT, month INT); ``` #### 4. **引入分桶概念** 当存在多张关联紧密的小表时,可通过预先定义一致性的哈希分布规则来促进后续 Join 运算效率[^5]。 ```sql CREATE TABLE user_profile ( user_id BIGINT, age INT, gender STRING ) CLUSTERED BY(user_id) INTO 8 BUCKETS; ``` #### 5. **动态分区管理** 适当调节相关参数阈值,避免因过度细分引发额外负担的同时保障灵活性。 ```sql SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions.pernode=100; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值