整理了一下网上的几种Hive文件存储格式的性能与Hadoop的文件存储格式。
Hive的三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的,RCFILE是基于行列混合的思想,先按行把数据划分成N个row group,在row group中对每个列分别进行存储。另:Hive能支持自定义格式,详情见:Hive文件存储格式
下面对这几种几个作一个简单的介绍:
TextFile:
Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
SequenceFile:
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。
SequenceFile的文件结构图:
Header通用头文件格式:
SEQ | 3BYTE |
Nun | 1byte数字 |
keyClassName | |
ValueClassName | |
compression | (boolean)指明了在文件中是否启用压缩 |
blockCompression | (boolean,指明是否是block压缩) |
compression | codec |
Metadata | 文件元数据 |
Sync | 头文件结束标志 |
Block-Compressed SequenceFile格式
RCFile
RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按行划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
RCFile stores table data in a flat file consisting of binary key/value pairs. It first partitions rows horizontally into row splits, and then it vertically partitions each row split in a columnar way. RCFile stores the metadata of a row split as the key part of a record, and all the data of a row split as the value part.
下面介绍行存储、列存储(详细参照:Facebook数据仓库揭秘:RCFile高效存储结构)
行存储
HDFS块内行存储的例子:
基于Hadoop系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同记录的所有域都在同一个集群节点,即同一个 HDFS块。不过,行存储的缺点也是显而易见的,例如它不能支持快速查询处理,因为当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取;此 外,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高。
列存储
HDFS块内列存储的例子
在HDFS上按照列组存储表格的例子。在这个例子中,列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。查询时列存储能够避免读不必要的列, 并且压缩一个列中的相似数据能够达到较高的压缩比。然而,由于元组重构的较高开销,它并不能提供基于Hadoop系统的快速查询处理。列存储不能保证同一 记录的所有域都存储在同一集群节点,行存储的例子中,记录的4个域存储在位于不同节点的3个HDFS块中。因此,记录的重构将导致通过集群节点网络的大 量数据传输。尽管预先分组后,多个列在一起能够减少开销,但是对于高度动态的负载模式,它并不具备很好的适应性。
RCFile结合行存储查询的快速和列存储节省空间的特点:首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。
HDFS块内RCFile方式存储的例子:
数据测试
第一步:创建三种文件类型的表,建表语法参考Hive文件存储格式
--TextFile set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; INSERT OVERWRITE table hzr_test_text_table PARTITION(product='xxx',dt='2013-04-22') SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22'; --SquenceFile set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; set io.seqfile.compression.type=BLOCK; INSERT OVERWRITE table hzr_test_sequence_table PARTITION(product='xxx',dt='2013-04-22') SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22'; --RCFile set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; INSERT OVERWRITE table hzr_test_rcfile_table PARTITION(product='xxx',dt='2013-04-22') SELECT xxx,xxx.... FROM xxxtable WHERE product='xxx' AND dt='2013-04-22';
第二步:测试insert overwrite table tablename select.... 耗时,存储空间
类型 | insert耗时(S) | 存储空间(G) |
Sequence |
97.291 |
7.13G |
RCFile |
120.901 |
5.73G |
TextFile |
290.517 |
6.80G |
insert耗时、count(1)耗时比较:
第三步:查询响应时间
测试一
方案一,测试整行记录的查询效率: select * from hzr_test_sequence_table where game='XXX' ; select * from hzr_test_rcfile_table where game='XXX' ; select * from hzr_test_text_table where game='XXX' ; 方案二,测试特定列的查询效率: select game,game_server from hzr_test_sequence_table where game ='XXX'; select game,game_server from hzr_test_rcfile_table where game ='XXX'; select game,game_server from hzr_test_text_table where game ='XXX';
文件格式 |
查询整行记录耗时(S) |
查询特定列记录耗时(S) |
sequence |
42.241 |
39.918 |
rcfile |
37.395 |
36.248 |
text |
43.164 |
41.632 |
方案耗时对比:
测试二:
本测试目的是验证RCFILE的数据读取方式和Lazy解压方式是否有性能优势。数据读取方式只读取元数据和相关的列,节省IO;Lazy解压方式只解压相关的列数据,对不满足where条件的查询数据不进行解压,IO和效率都有优势。
方案一:
记录数:698020
insert overwrite local directory 'XXX/XXXX' select game,game_server from hzr_test_xxx_table where game ='XXX';
方案二:
记录数:67236221
insert overwrite local directory 'xxx/xxxx' select game,game_server from hzr_test_xxx_table;
方案三:
记录数:
insert overwrite local directory 'xxx/xxx' select game from hzr_xxx_rcfile_table;
文件类型 | 方案一 | 方案二 | 方案三 |
TextFile | 54.895 | 69.428 | 167.667 |
SequenceFile | 137.096 | 77.03 | 123.667 |
RCFile | 44.28 | 57.037 | 89.9 |
上图表现反应在大小数据集上,RCFILE的查询效率高于SEQUENCEFILE,在特定字段数据读取时,RCFILE的查询效率依然优于SEQUENCEFILE。
相关推荐
hive测试数据,其中为日志类型,用于验证在hive中主流文件存储格式对比实验
标题 "hive测试题(包含万级测试数据文件)" 指的是一个与Hive相关的练习或测试集,其中可能包含了用于大数据分析的万级条目数据。这些数据可能被设计成模拟真实世界的业务场景,帮助学习者或者从业者检验和提升在Hive...
Hive是Apache Hadoop生态系统中的一个数据仓库工具,它允许用户使用SQL方言(称为HQL)来查询、管理和处理大规模存储在Hadoop分布式文件系统(HDFS)中的数据。这个测试数据集“hive操作相关的测试数据集hive”显然...
在Hive中,数据通常是存储在分隔符分割的文本文件中,例如CSV或TSV格式,每行代表一条记录,列之间用特定字符(如逗号、制表符)分隔。"uaction.dat"文件可能采用了类似格式,每行记录了一个用户的某个操作,列可能...
5. **调优与迭代**:根据测试结果,对Hive进行调优,比如调整执行计划、优化join策略、使用更高效的文件格式等。然后再次运行测试脚本,看是否有所改进。 6. **报告编写**:最后,整理测试过程和结果,编写详细的...
4. **文件格式**:Hive支持多种文件格式,如TextFile、SequenceFile、ORC和Parquet,每种格式都有其特定的优缺点,适用于不同的场景。 5. **表分区**:通过将大表按照某个或某些列的值划分为较小的部分,可以显著...
在Hive 2.1.1版本中,ORC(Optimized Row Columnar)格式是一种高效的数据存储方式,尤其适用于大数据处理。它提供了压缩、索引和列式存储等特性,能够极大地提高查询性能。然而,有时候在使用ORC格式读取数据时,...
因此,设计合理的分区策略、合并小文件、使用ORC或Parquet等列式存储格式、使用Bucketing和Sorting等方法可以优化性能。 8. **Hive与ETL**:在大数据处理中,Hive常用于ETL(提取、转换、加载)流程。通过Hive,...
例如,提供的压缩包文件"10万条小表数据(id为9万+随机数字)"可能是CSV或者TSV格式,可以使用`LOAD DATA LOCAL INPATH`命令将其加载到Hive表中。 2. **表分区**:为了优化查询性能,小表可以设计为分区表,尤其是...
这些数据经过预处理后,被转化为Hive可识别的格式,如CSV或JSON,然后上传到HDFS(Hadoop分布式文件系统)中。测试数据的选择至关重要,因为它直接影响到Hive查询性能的评估和数据分析的准确性。 1. **数据导入与...
`springmvc配置`涉及到的是Spring框架的配置文件,通常以XML格式存在,如`hive-config.xml`。在这个配置文件中,我们需要定义数据源、事务管理器以及其他与Hive JDBC相关的设置。为了使用Kerberos认证,我们需要在...
在大数据处理领域,Hive是一款基于Hadoop的数据仓库工具,它允许用户使用SQL类的语言(称为HQL)来查询、管理、分析存储在Hadoop分布式文件系统中的大规模数据集。而DataGrip是一款由JetBrains公司开发的强大数据库...
这些HIVE文件存储在%SystemRoot%\System32\config目录下,以REG_FIL格式存在。 "Windows XP注册表文件格式简单分析.doc"文档可能详细阐述了注册表HIVE文件的内部结构,包括块、链表、索引节点等。每个HIVE文件由一...
7. **hive-serde-0.11.0.jar**:Hive SerDe(Serilization/Deserialization)是 Hive 对数据进行序列化和反序列化的接口,用于将不同格式的数据转化为 Hive 可以理解的形式。 8. **log4j-1.2.14.jar**:这是一个...
Hive依赖于Hadoop的分布式文件系统(HDFS)存储数据,其工作原理是将数据转换为适合MapReduce任务的格式,然后通过MapReduce进行计算。Hive的元数据(如表结构、分区等)存储在MySQL或其它数据库中,用于管理和跟踪...
- **支持多种数据格式**: 支持多种存储格式,如TextFile、SequenceFile、ORC等。 - **高容错性**: 基于Hadoop的分布式文件系统(HDFS),具有高容错性。 - **应用场景**: - **数据分析**: 用于离线批处理数据,...
Hive支持多种数据存储格式,包括文本文件、序列化文件等。这些数据存储在HDFS中,并且可以通过Hive表来访问。 **1.6 其他Hive操作** 除了基本的数据存储和查询之外,Hive还支持一系列其他操作,如数据导入导出、...
比如`avro.jar`用于Avro数据格式,`zookeeper.jar`用于ZooKeeper服务,`slf4j-api.jar`和`slf4j-log4j12.jar`用于日志记录,以及其他可能的数据库驱动,如`mysql-connector-java.jar`如果Hive配置了MySQL元存储。...
Hive还支持其他数据存储格式,如ORC(优化列存储)和Parquet等。 Hive提供了基本操作语句,如创建表(CreateTable)、插入数据(Insert)、加载数据(Load)和显示数据(Show)等。除了基本的CRUD操作外,Hive还...