大数据存储格式选择
大数据时代,存储和压缩数据的方式至关重要。为节省空间并确保数据完整性,我们采用了多种策略,包括不同的存储格式和压缩算法。存储格式主要有单行/列式存储、混合行列式存储,其中行式存储适用于实时处理(OLTP),列式存储擅长数据分析(OLAP),混合存储则结合两者特性。常见的存储格式有Parquet(适合数据分析)、ORC(Hive特有)、TextFile(简单但效率低)、SequenceFile(Hadoop API兼容)和AVRO(灵活且支持多种功能)。
压缩格式的选择同样关键,常见的有Deflate、Snappy、ZLib、Gzip、Bzip2、LZ4和LZO等。压缩比和速度是关键考虑因素:Bzip2提供最高压缩比但速度慢,Snappy速度最快但压缩率低;Gzip和ZLib适中,支持Hadoop native库;LZO速度快且支持split,但需要额外安装;LZ4和Deflater注重速度。
在数据分层中,ODS层(源数据层)倾向于使用高压缩比的ZLIB、GZIP或BZIP2,而DW层(数据仓层)和DA层(数据应用层)由于查询频繁,适合选用解压缩速度较快的Snappy。这样,我们可以根据数据特性和需求,灵活选择最优化的存储和压缩方案,以提升存储效率和查询性能。
2. 为什么大数据存储都喜欢使用 ORC 格式,因为快,小
ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化。据官方文档介绍,这种文件格式可以提供一种高效的方法来存储Hive数据。它的设计目标是来克服Hive其他格式的缺陷。运用ORC File可以提高Hive的读、写以及处理数据的性能。
在工作中,用的最多的地方是在 Hive 中。我们的数据存储格式使用的 ORC 。
存储数据除了考虑安全性, 所占空间 以及 查询效率 是直接关系到我们的业务的。数据量不压缩,对于大数据团队来说,集群的磁盘很容易不够用。数据存进去,我们是要用的,业务方提了一个小需求,你的任务跑了大半个小时,显然也是不合理的。
这些问题都可以解决掉,但并不是完全解决。
如果我的文章对您有帮助,欢迎关注、转发。您的支持就是我更新的最大动力。
3. 大数据常用文件格式介绍
图片看不见的话可以看我CSDN上的文章:
https://blog.csdn.net/u013332124/article/details/86423952
最近在做hdfs小文件合并的项目,涉及了一些文件格式的读写,比如avro、orc、parquet等。期间阅读了一些资料,因此打算写篇文章做个记录。
这篇文章不会介绍如何对这些格式的文件进行读写,只会介绍一下它们各自的特点以及底层存储的编码格式 。
[图片上传失败...(image-a5104a-1547368703623)]
使用sequencefile还可以将多个小文件合并到一个大文件中,通过key-value的形式组织起来,此时该sequencefile可以看做是一个小文件容器。
[图片上传失败...(image-4d03a2-1547368703623)]
Parquet是一个基于列式存储的文件格式,它将数据按列划分进行存储。Parquet官网上的文件格式介绍图:
[图片上传失败...(image-92770e-1547368703623)]
我们可以看出,parquet由几个部分构成:
[图片上传失败...(image-391e57-1547368703623)]
Orc也是一个列式存储格式,产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。
[图片上传失败...(image-ba6160-1547368703623)]
目前列式存储是大数据领域基本的优化项,无论是存储还是查询,列式存储能做的优化都很多,看完上面对orc和parquet的文件结构介绍后,我们列式存储的优化点做一个总结:
在压缩方面 :
在查询方面 :
就网上找到的一些数据来看,Orc的压缩比会比Parquet的高一些,至于查询性能,两个应该不会差距太大。本人之前做过一个测试,在多数场景,hive on mr下,orc的查询性能会更好一些。换成hive on spark后,parquet的性能更好一些
本文介绍的4种大数据存储格式,2个是行式存储,2个是列式存储,但我们可以看到一个共同点:它们都是支持分割的。这是大数据文件结构体系中一个非常重要的特点, 因为可分割使一个文件可以被多个节点并发处理,提高数据的处理速度 。
另外,当前大数据的主要趋势应该是使用列式存储,目前我们公司已经逐步推进列式存储的使用,本人也在hive上做过一些测试,在多个查询场景下,无论是orc还是parquet的查询速度都完爆text格式的, 差不多有4-8倍的性能提升 。另外,orc和parquet的压缩比都能达到10比1的程度。因此,无论从节约资源和查询性能考虑,在大多数情况下,选择orc或者parquet作为文件存储格式是更好的选择。另外,spark sql的默认读写格式也是parquet。
当然,并不是说列式存储已经一统天下了,大多时候我们还是要根据自己的使用场景来决定使用哪种存储格式。
Sequencefile
https://blog.csdn.net/en_joker/article/details/79648861
https://stackoverflow.com/questions/11778681/advantages-of-sequence-file-over-hdfs-textfile
Avro和Sequencefile区别
https://stackoverflow.com/questions/24236803/difference-between-avrodata-file-and-sequence-file-with-respect-to-apache-sqoop
parquet
https://www.cnblogs.com/ITtangtang/p/7681019.html
Orc
https://www.cnblogs.com/ITtangtang/p/7677912.html
https://www.cnblogs.com/cxzdy/p/5910760.html
Orc和parquet的一些对比
https://blog.csdn.net/colorant/article/details/53699822
https://blog.csdn.net/yu616568/article/details/51188479