by hugh.wangp
根据自身涉及到的数据分布和使用需求,对HIVE上的三类文件格式做了如下测试,指导HIVE的文件格式选型。测试存在环境、数据分布、测试偏重点的不同,本测试只供参考,不作为大家选型决策的绝对指导。
HIVE的三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的,RCFILE是基于行列混合的思想,先按行把数据划分成N个row group,在row group中对每个列分别进行存储。
基于HDFS的行存储具备快速数据加载和动态负载的高适应能力,因为行存储保证了相同记录的所有域都在同一个集群节点。但是它不太满足快速的查询响应时间的要求,因为当查询仅仅针对所有列中的少数几列时,它就不能跳过不需要的列,直接定位到所需列;同时在存储空间利用上,它也存在一些瓶颈,由于数据表中包含不同类型,不同数据值的列,行存储不易获得一个较高的压缩比。RCFILE是基于SEQUENCEFILE实现的列存储格式。除了满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。
接下来就针对压缩比、数据加载、查询响应角度对HIVE的三种文件格式进行比较,主要比较对象为SEQUENCEFILE和RCFILE,因为TEXTFILE在压缩后不能发挥MapReduce的并行处理能力,所以此文件格式不会被我们采用。
压缩比
测试数据为1月11号产品表的当前数据,利用此数据保存到三张表,分别采用三种文件格式,压缩方式统一为gzip
存储格式 文件大小
TEXTFILE 21.4GB
SEQUENCEFILE 22.3GB
RCFILE 18.0GB
RCFILE的压缩比优于SEQUENCEFILE。
上图是HADOOP的不同压缩方法的一个性能对比图(摘自《pro hadoop》第5章),其中gzip是空间和时间比较折中的压缩方法,后续测试也反应了这一点。
数据加载
上图是三类文件格式的数据插入不同压缩类型,不同文件格式的数据加载时间对比图。
1.同一份数据的加载时间为lzo < gzip < bz2和不同压缩方式性能对比图的结果一致。
2.目标表为SEQUENCEFILE的数据加载时间优于TEXTFILE和RCFILE。
查询响应
测试1:
数据表wp_product_target包含62个字段,字段类型包含:BIGINT、DOUBLE、STRING。
执行如下两种SQL查询:
方案一,测试整行记录的查询效率:
select * from wp_product_target where product_id like '480523%';
方案二,测试特定列的查询效率:
select product_id, gmt_create, dw_end_date from wp_product_target where product_id like '480523%';
上图反映了RCFILE的查询效率都优于SEQUENCEFILE。
测试2:
数据表wp_product_detail包含8个字段,只取了product_id和description两个字段做测试。product_id的数据占用存储为:447MB,description的数据占用存储为:89697MB。
本测试目的是验证RCFILE的数据读取方式和Lazy解压方式是否有性能优势。数据读取方式只读取元数据和相关的列,节省IO;Lazy解压方式只解压相关的列数据,对不满足where条件的查询数据不进行解压,IO和效率都有优势。
方案一:
insert overwrite local directory '/home/dwapp/hugh.wangp'
select product_id, description
from wp_product_detail
where product_id like '480523%';
方案二:
insert overwrite local directory '/home/dwapp/hugh.wangp'
select product_id, description
from wp_product_detail
where substr(product_id, 1, 2) = '50';
方案三:
insert overwrite local directory '/home/dwapp/hugh.wangp'
select product_id, description
from wp_product_detail_sf;
方案四:
insert overwrite local directory '/home/dwapp/hugh.wangp'
select product_id
from wp_product_detail;
前三个方案的查询数据量:800条,700万条,1.8亿条。
上图反应在大小数据集上,RCFILE的查询效率高于SEQUENCEFILE。
上图反应在特定字段数据读取时,RCFILE的查询效率依然优于SEQUENCEFILE。
总结
1.在压缩比方面,RCFILE有较优的压缩比,因为SEQUENCEFILE是行压缩,行内不同数据值统一压缩,但是RCFILE对每列独立压缩,避免了不同数据值的混合压缩,所以压缩比相对高一些。但是由于对列进行压缩存储,压缩性能比单单对行进行压缩消耗更多。也正体现了压缩的空间和时间的矛盾体。
2.数据加载方面,SEQUENCEFILE优于RCFILE,因为RCFILE的列压缩方式,数据加载压缩时的性能消耗比较大。但是对于数据仓库的一次写入、多次读取,数据的加载性能对整体利用影响没有压缩比和查询响应大。
3.查询响应方面,RCFILE有较优的表现。RCFILE的数据读取方式和Lazy解压方式起到了很大的作用,在读取数据的每个行组时,RCFILE只需读取元数据头部和查询指定的列,而不是行组的全部数据都读到内存中,节省了很多的I/O。虽然读取了元数据头部和查询指定的列,但是不是对这些数据完全解压,Lazy解压技术保证了,只解压满足where条件的数据。
总之,相对于SEQUENCEFILE,RCFILE的压缩比有20%左右的提升,数据加载时间有10%左右的劣势,查询响应时间平均有15%左右的优势,尤其在大数据量的非全字段查询上有30%左右的性能优势。
所以从上面的测试比较可以看出,RCFILE是HIVE最适合的文件存储格式,压缩方式采用GZIP压缩。
业界使用情况,FACEBOOK目前所有HIVE的文件全部采用RCFILE存储,国内的盛大也采用RCFILE存储。