一、理论知识学习:底层决定上层建筑
此部分内容引用了:Hive表的几种存储格式 - 海贼王一样的男人 - 博客园
Hive的文件存储格式:
textFile为默认格式
存储方式:行存储
缺点:磁盘开销大;数据解析开销大;压缩的text文件,hive无法进行合并和拆分
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储
优点:可分割、压缩,一般选择block压缩,与hadoop api中的mapfile是互相兼容的。
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
官网介绍:
1 |
The Optimized Row Columnar (ORC) file format provides a highly efficient way to store Hive data. It was designed to overcome limitations of the other Hive file formats. Using ORC files improves performance when Hive is reading, writing, and processing data. |
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个小时,太让人意外和惊喜!