如何1分钟内完成遍历100T数据?

简介: 如何1分钟内完成遍历100T数据?

如何快速遍历一个超大数据集 ?



文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限。如果才能在1 分钟内完成 100T 大文件的遍历呢?


磁盘存储结构


磁盘是一种可持久保存,持续读写数据的存储介质。磁盘分类:

  • 机械硬盘
  • 固态硬盘


机械硬盘结构


机械硬盘,包含,盘片,主轴,磁头臂,主轴带动盘片高速旋转。

  • 读取数据地上,磁头臂移动到盘片的磁道上,磁头读取磁道上的数据。


640.png



机械硬盘的数据是存储在磁性特质的盘片上的,因此叫做磁盘。


640.png



  • 读写数据是需要移动磁头,这样一个机械动作,可能需要花费几毫秒的时间。机械操作比较慢的,因此读写数据就比较慢。


固态硬盘


固态硬盘是通过主控芯片处理端口输入的指令和数据,通过控制闪存颗粒和数据读写,完全是电子操作,没有机械物理移动,访问速度会非常快。


文件系统


开发者,并不直接操作磁盘,而是通过操作系统,以文件交互的形式进行磁盘读写操作。文件系统将磁盘空间以块为单位进行划分,每个文件占据若干数据块。然后通过文件控制块(FCB) 记录每个文件占据了哪些数据块。


640.png

文件控制块,对应的是Linux 操作系统中的 inode,如果要访问文件,必须获得文件的 inode 信息,在 inode 中查询文件数据块索引表,根据索引记录的硬盘地址访问磁盘,读写数据。


inode 结构


inode 记录访问权限,修改时间,文件大小等信息。还有文件索引块的磁盘地址索引。inode 一共有15个索引。前12 个索引直接记录数据库地址。第13 个索引记录(一级索引指针)指向的并不直接是文件数据,而是记录文件块的索引表。每个索引可以记录 256个索引。第14 个事二级索引地址,第15个索引记录三级索引地址。


640.png

每个 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

640.png

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.

640.png

DataNode 负责文件的存储和读写, HDFS 将文件分割成若干数据块(Block)。每个DataNode 存储一些数据块。应用程序并行对数据块进行访问,从而得到 HDFS可以在服务器集群规模上实现并行的数据访问,极大提高访问速度。一般有几百台或者上千台服务器,这样整个集群的数据存储可达到 PB 级别。

NameNode 负责整个分布式文件系统元数据(MetaData)管理, 也就文件路径名,访问权限,数据块 ID 和 存储位置信息。和 Linux 中 inode 文件控制块类似。HDFS 为保证数据高可用,一般将数据库进行备份,默认3份。并将多份相同的数据存储在不同的服务器上,及时某个服务器 DataNode 宕机,客户端也能通过查找其他服务器备份数据进行访问。


如果实现 1分钟遍历 100T 数据?


基于 HDFS ,可以实现 百T 数据存储,同时配合 MapReduce ,通过配置几千台服务器并行计算,同时遍历 100 T 数据。1 分钟是可以实现的。


相关文章
|
7月前
|
算法 C++
87 C++ - 常用遍历算法
87 C++ - 常用遍历算法
26 0
|
1月前
|
JavaScript 小程序
遍历类数组之获取多个dom节点并遍历
遍历类数组之获取多个dom节点并遍历
|
1月前
各种遍历方法以及注意点
各种遍历方法以及注意点
23 0
|
11月前
链表学习(链表的创建,插入,删除,查找,遍历)
链表学习(链表的创建,插入,删除,查找,遍历)
103 0
逆序遍历List集合
逆序遍历List集合
46 0
|
存储 机器学习/深度学习 人工智能
关于哈密顿路是否存在的遍历算法
我是怎么也没想到这个问题陪伴了我快十年的时光,占到了我生命的一半时光(当然不可能一直在死磕这道题),十年中每每学到一些新的知识都会进行一些尝试,但很多时候还是无功而返,大概在十天前复习数据结构相关知识的时候偶然发现了一个简单而且有趣的公式,然后灵感就来了,不过有一点点遗憾的是身为学数学的出身的,未能使用纯数学的方式解决,有一点点丢人,话不多说,请看正文。
108 0
关于哈密顿路是否存在的遍历算法
关于对象遍历的时候的一些排序问题
关于对象遍历的时候的一些排序问题
关于对象遍历的时候的一些排序问题
v-for遍历对象、数组
v-for遍历对象、数组
105 0