Hive表的几种存储格式及在性能调优应用
一、理论知识学习:底层决定上层建筑
此部分内容引用了:Hive表的几种存储格式 - 海贼王一样的男人 - 博客园
Hive的文件存储格式:
- textFile
textFile为默认格式
存储方式:行存储
缺点:磁盘开销大;数据解析开销大;压缩的text文件,hive无法进行合并和拆分
- sequencefile
二进制文件,以
存储方式:行存储
优点:可分割、压缩,一般选择block压缩,与hadoop api中的mapfile是互相兼容的。
- Rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
- ORC
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
官网介绍:
| 1 |
|
ORC实际上是在RC文件存储格式做了一些优化,它的主要优点有:
(1)、每个task只输出单个文件,这样可以减少NameNode的负载;
(2)、支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union);
(3)、在文件中存储了一些轻量级的索引数据;
(4)、基于数据类型的块模式压缩:a、integer类型的列用行程长度编码(run-length encoding);b、String类型的列用字典编码(dictionary encoding);
(5)、用多个互相独立的RecordReaders并行读相同的文件;
(6)、无需扫描markers就可以分割文件;
(7)、绑定读写所需要的内存;
(8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。
- 自定义格式
用户可以通过实现inoutformat和outputformat来定义输入输出格式。
二、性能调优中应用
调优前性能情况:流程包括下面两部分
第一部分, 将源头hive表数据加工成hive外部临时表,存储格式:txtfile,记录数2.6亿,此过程耗时:20多分钟。
第二部分,通过公司研发的抽取工具,hive外部临时表数据抽取到hbase表中。耗时近11个小时27分钟。
尝试优化方法:
1 hive表分区并发读取。 id不好拆分,拆分对原来流程调整比较大--不采用。
2 对目标hbase表进行预先分区。 前面尝试过,hbase预分区后,提升效果不大,--不采用
3 从hive的底层存储格式下手,选择推荐读写效率、压缩效果较好的orc格式。--采用
尝试优化:
1 调整建表语句
-- 修改前建表语句
| CREATE EXTERNAL TABLE `fk_bp_apidetail_proc`( |
| `id` string, |
。。。。。
| `partitioncode` string) |
| ROW FORMAT SERDE |
| 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' |
| STORED AS INPUTFORMAT |
| 'org.apache.hadoop.mapred.TextInputFormat' |
| OUTPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' |
-- 修改后建表语句
| CREATE TABLE `fk_bp_apidetail_proc`( |
| `id` string, |
。。。。。。
| `partitioncode` string) |
| ROW FORMAT SERDE |
| 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' |
| STORED AS INPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' |
| OUTPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' |
2 调整数据处理脚本为spark sql(由于原hive sql脚本处理耗时就少,所以此处起的性能优化可以忽略,就不在此啰嗦)
3 调整前效果, 耗时减少到1小时44分钟,减少了近10个小时,太让人意外和惊喜!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
