Hive_Hive 中常见的数据格式 与性能分析

 

参考文章:

1. hive四种存储格式介绍与分析比较

https://blog.csdn.net/zyzzxycj/article/details/79267635

 

Hive 中有如下的数据文件格式, textfile , sequencefile, avro,  rcfile , orcfile , parquet,  自定义存储格式 。本文将介绍这几种数据文件格式的区别与效率。

 

下面分别介绍下这几种格式:

 

TEXTFILE :

   textfile 为默认的数据存储格式,textfile 以文本文件的形式存储数据,

  该种方式默认不对数据进行压缩处理,效率比较低下。

  一般极少采用这种方式。

 

 

SEQUENCEFILE :

存储特点:

      二进制文件,以的形式序列化到文件中

存储方式:行存储

特点:

     可分割,压缩。支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。压缩模式一般选择block压缩

优势是文件和Hadoop api中的mapfile是相互兼容的。

 

 

AVRO:

 Avro(读音类似于[ævrə])是Hadoop的一个子项目,由Hadoop的创始人Doug Cutting牵头开发。Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。

它的主要特点有:

支持二进制序列化方式,可以便捷,快速地处理大量数据;

动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。

 

 

RCFILE:

      Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常

写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。

     RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读

取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
 

存储方式:数据按行分块 每块按照列存储

优势:

      1.压缩快 快速列存取

      2.读记录尽量涉及到的block最少。读取需要的列只需要读取每个row group 的头部定义。

      3. 读取全量数据的操作 性能可能比sequencefile没有明显的优势

 

 

 

ORCFILE:

    ORC(OptimizedRC File)存储源自于RC(RecordColumnar File)这种存储格式,RC是一种列式存储引擎。对schema演化(修改schema需要重新生成数据)支持较差,而ORC是对RC改进,但它仍对schema演化支持较差。主要是在压缩编码,查询性能方面做了优化。RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目。

相对于 RCFILE :

    效率比rcfile高,是rcfile的改良版本,相比RC能够更好的压缩,能够更快的查询,但还是不支持模式演进

     Hive 1.x版本对事务和update操作的支持,便是基于ORC实现的(其他存储格式暂不支持)。

     ORC发展到今天,已经具备一些非常高级的feature,比如支持update操作,支持ACID,支持struct,array复杂类型。你可以使用复杂类型构建一个类似于parquet的嵌套式数据架构,但当层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型。


存储方式 :数据按行分块 每块按照列存储

优势 :

   1. 压缩快 快速列存取

    2.效率比rcfile高,是rcfile的改良版本

 

 

PARQUET:

     Parquet能够很好的压缩,有很好的查询性能,支持有限的模式演进。但是写速度通常比较慢。这中文件格式主要是用在Cloudera Impala上面的。

存储方式: 列存储

 

自定义存储格式:

     用户可以通过实现InputFormat  和 OutputFormat 来自定义输入输出格式。

 

 

 

Hive 中使用这几种数据格式的注意事项:

       SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

 

 

摘自 :

Hive的几种常见压缩格式(ORC,Parquet,Sequencefile,RCfile,Avro)的读写查询性能测试

 https://blog.csdn.net/weixin_36714575/article/details/80091578

 

性能测试:

 

一.测试背景


     工作中想把历史的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版本选择:

Hive_Hive 中常见的数据格式 与性能分析_第1张图片

 

三.实际操作

 

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';
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)

 

RCFILE:

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_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

 

ORC:

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_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

 

SequenceFile

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_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

 

Parquet :

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_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

 

AVRO:

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

 

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,Hadoop)