如何快速遍历一个超大数据集 ?
文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限。如果才能在1 分钟内完成 100T 大文件的遍历呢?
磁盘存储结构
磁盘是一种可持久保存,持续读写数据的存储介质。磁盘分类:
- 机械硬盘
- 固态硬盘
机械硬盘结构
机械硬盘,包含,盘片,主轴,磁头臂,主轴带动盘片高速旋转。
- 读取数据地上,磁头臂移动到盘片的磁道上,磁头读取磁道上的数据。
机械硬盘的数据是存储在磁性特质的盘片上的,因此叫做磁盘。
- 读写数据是需要移动磁头,这样一个机械动作,可能需要花费几毫秒的时间。机械操作比较慢的,因此读写数据就比较慢。
固态硬盘
固态硬盘是通过主控芯片处理端口输入的指令和数据,通过控制闪存颗粒和数据读写,完全是电子操作,没有机械物理移动,访问速度会非常快。
文件系统
开发者,并不直接操作磁盘,而是通过操作系统,以文件交互的形式进行磁盘读写操作。文件系统将磁盘空间以块为单位进行划分,每个文件占据若干数据块。然后通过文件控制块(FCB) 记录每个文件占据了哪些数据块。
文件控制块,对应的是Linux 操作系统中的 inode,如果要访问文件,必须获得文件的 inode 信息,在 inode 中查询文件数据块索引表,根据索引记录的硬盘地址访问磁盘,读写数据。
inode 结构
inode 记录访问权限,修改时间,文件大小等信息。还有文件索引块的磁盘地址索引。inode 一共有15个索引。前12 个索引直接记录数据库地址。第13 个索引记录(一级索引指针)指向的并不直接是文件数据,而是记录文件块的索引表。每个索引可以记录 256个索引。第14 个事二级索引地址,第15个索引记录三级索引地址。
每个 inode 最多可存储 12+256 +256256+ 256256*256 个数据块。如果每个数据块的大小为 4K ,那么 单个文件最大不超过 70 G 。
inode 存在的问题
单个文件大小有限制,即使扩大数据块大小,文件大小也要受到单个磁盘容量的限制,如果要无法完成 100 T数据遍历。Linux 系统是无法做到的。
RAID
RAID ,也叫做独立磁盘冗余阵列。将多个磁盘块通过硬件 RAID 卡或者软件 RAID 进行管理共同对外提供服务。
RAID 的核心思路是利用文件系统将数据写入磁盘中不同数据块的特性,将多块硬盘上的空闲空间看做一个整体,进行数据写入,也就是说,一个文件的多个数据,一个文件的多个数据块可能写入多个硬盘。
RAID 分类
RAID 一个有5种:
- RAID 0
- RAID 1
- RAID 10
- RAID 5
- RAID 6
RAID 0 将一个文件的数据分成 N 片,同时向 N 个硬盘写入。这样单个文件可以存在 N 个硬盘。文件容量可以扩大 N 倍。理论上读写速度也可以扩大 N 倍。
RAID 问题
RAID 0 最大问题是文件数据 分布在 N 块磁盘上,任何一块磁盘损坏,就会导致数据不完整。整个文件系统全部损坏,文件可用性降低。
RAID 1
RAID 是利用两块磁盘进行数据备份,文件同时向两块磁盘写入。这样任何一块磁盘损坏都不会出现文件数据丢失的情况。文件可用性得到提升。但是磁盘扩展性受限,并没有分成 N 片。
RAID 10
RAID 10 是结合了RAID 1 和 RAID 0 ,将多块磁盘进行两两分组,文件数据分成 N 片,每个分组写入一片,每个分组内的两块磁盘进行数据备份,这样的好处是,扩大了文件的容量,又提高了文件的可用性,但是存在的问题是,磁盘利用率只有 50% ,因为有一半硬盘用来做备份。
RAID 5
RAID 5 是针对 RAID 10 磁盘浪费的情况,将数据分成了 N -1 片,在利用 N-1 片进行位运算,计算出一片校验数据。然后将这N片数据写入 N 个硬盘,这样任何一个磁盘损坏,都可以通过校验片的数据和其他数据进行计算,得到这片丢失的数据。 磁盘利用率提高到了N-1/N。RAID 5 可以解决一块磁盘损坏后文件不可用的问题。 如果两块磁盘损坏呢?
RAID 6
RAID 6 是用两种位运算校验算法计算两片校验数据,这样两块磁盘损坏还是可以通过计算得到丢失的数据片。
RAID 5 孙然可以将数据分成 N-1 片,然后并发写入 N-1 块硬盘。这样可以得到很好的磁盘利用率,文件系统速度和容量都提高了 N-1 倍。但是通过一台服务器上扩展硬盘数量还是有限的,一般是8块。并不能实现 1分钟完成 100 T 文件的遍历要求。
分布式文件系统
查询inode 中索引记录得到的是数据块的磁盘地址。但是是想,如果将数据块的次哦按地址改成分布式服务器的地址呢?这样查询到的数据就不仅限于本机的硬盘地址,可以查询其他服务器的地址。这样整个文件系统的容量就是整个分布式文件系统的容量。并且通过不同服务器同时并行读取数据(相当于多线程),那文件访问速度也是非常的快。
分布式文件系统的实现思路和 RAID 是相似的,都将数据分成多片。同时向 N 台服务器写入数据。为避免和RAID 0 出现一片数据损坏问题导致文件系统损坏, 分布式文件系统采用了数据备份方式,将多个备份数据写入多个服务器。依次来保证文件可用性。 也可以采用类似RAID 通过计算数据校验的方式来得到丢失数据。
HDFS
HDFS 主要 两个重要部分:NameNode ,DataNode.
DataNode 负责文件的存储和读写, HDFS 将文件分割成若干数据块(Block)。每个DataNode 存储一些数据块。应用程序并行对数据块进行访问,从而得到 HDFS可以在服务器集群规模上实现并行的数据访问,极大提高访问速度。一般有几百台或者上千台服务器,这样整个集群的数据存储可达到 PB 级别。
NameNode 负责整个分布式文件系统元数据(MetaData)管理, 也就文件路径名,访问权限,数据块 ID 和 存储位置信息。和 Linux 中 inode 文件控制块类似。HDFS 为保证数据高可用,一般将数据库进行备份,默认3份。并将多份相同的数据存储在不同的服务器上,及时某个服务器 DataNode 宕机,客户端也能通过查找其他服务器备份数据进行访问。
如果实现 1分钟遍历 100T 数据?
基于 HDFS ,可以实现 百T 数据存储,同时配合 MapReduce ,通过配置几千台服务器并行计算,同时遍历 100 T 数据。1 分钟是可以实现的。