大数据的存储结构直接影响到分布式系统中数据的存储效率和处理应能。一般来说常见的存储结构有行式存储结构、列式存储结构和行列结合存储结构。在行式存储结构中数据从本地读取,加载速度快但是压缩效率低并且存在数据冗余。在列式存储结构中数据压缩率高,但是因为数据的跨节点访问所以增加了网络传输的开销。针对行式存储结构和列式存储结构的优缺点,提出了一种行列结合的存储结构。下面我们开始探讨一下这三种存储结构。
一、大数据处理要求
在所有的大数据系统中,对数据的处理要求无非就是三点:高速的数据加载、高速的查询处理和存储空间的高利用率。
1.1 高速的数据加载
数据的高速加载时大数据处理中的一个关键问题。在正常的查询时由于网络带宽、磁盘I/O在数据传输是一个瓶颈,因此缩短数据加载时间变得非常关键。
1.2 高速的查询处理
为满足大量用户同时向系统提交实时请求和高负载查询,因此这就要求底层数据结构在满足数据不断增长的同时,能够高效处理查询请求。
1.3 存储空间的高利用率
因为每时每刻数据量都在不断增长,因此要求系统在存储上就必须有很好的扩展能力。那么如何存放数据才能使得磁盘的利用率达到最高是关键问题。一般来说我们会用到动态高负载模式来处理,让系统在有限的存储空间下使用不可测的数据分析请求。
二、行式存储结构和列式存储结构的优缺点
2.1 行式存储结构
传统关系型数据库使用的存储结构就是行式存储结构,记录以行的形式存储在数据库关系表中。在分布式系统存储下,表按照行水平分割,每行中所有数据存放在同一个数据块中,数据块又有可能分布在不同的节点上,如果读取行中的第一列和第二列则需要先读取本地节点上所有符合条件的行,然后过滤出第一列和第二列。
行式存储结构的优点是数据加载速度快,所有数据优先从本地读取,不需要额外的网络开销。缺点是每行中所有列都放在了相同的数据块中,在读取一行数据时会读取当前行的所有列,这样就增加了额外的磁盘I/O开销。并且每一列存储的数据类型不能一样,在数据压缩时不同数据类型压缩效果会很大,这样会导致磁盘利用率低,同样也会导致磁盘I/O加大。
2.2 列式存储结构
列式存储结构将关系表按列垂直分割成多个子关系表,分割后的每组子关系表中的所有数据存放在同一个数据块中,每一列都是独立存储的。
列式存储结构的优点是只读取有用的列,能够避免额外的磁盘I/O开销,同一列中的数据类型相同,因此数据压缩时有很好的压缩比,提高了磁盘的空间利用率。缺点是由于列式存储按照列来垂直分割数据,因此不同的列可能分布在不同的节点上,读取不同的列会出现跨界点访问的问题,这样就增加了网络传输所消耗的时间。
下面是我列出的行式存储结构和列式存储结构的优缺点表格:
三、改进
3.1 行列结合存储结构
行列结合存储结构分别融合了行式存储和列式存储的优点,将关系表中的数据先按照水平划分成多个行组,每个行组存放在同一个数据块中,再在每个行组内将表按照列垂直划分成多个子关系表,每一列在进行数据压缩后存储在同一个数据块中。简单说就是:行组内按照列垂直存放在同一个数据块中,每列在数据压缩后独立存储在数据块中,每行中的所有列都存放在同一个数据块中。
3.2 优点
因为关系表被水平分割成多个行组,行组内按列垂直分割并存在同一个数据块中,如果要读取第一列和第二列,那么首先读取本地行组,然后在行组中选择第一列和第二列,这样就避免了不必要的磁盘I/O和网络消耗。并且由于行组内是按照列垂直分割的,每一列都具有相同的数据类型,因此在数据压缩时也能具有很好的数据压缩比,从而提高了磁盘空间的利用率。
3.3 问题
某些大数据框架存在数据块大小的限制,如果行组的存储空间比数据块最大大小要大,那么一个行组将会被存储到多个数据块中,多个数据块又有可能位于不同的节点上,因此在访问数据的时候有可能痴线跨节点访问,从而出现网络传出消耗。并且大部分大数据框架都具有备份功能,如果数据节点出现问题,因为行列结合存储结构的约束需要更长时间回复,维护成本也会增加。因此每个行组分割的大小不能超过数据块限制的最大大小。