如何在1 分钟内完成 100T 大文件的遍历?

Java 源码解读
Java 集合类源码,JUC 源码解读
wangxiaoming

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

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

磁盘存储结构

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

  • 机械硬盘
  • 固态硬盘

机械硬盘结构

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

  • 读取数据地上,磁头臂移动到盘片的磁道上,磁头读取磁道上的数据。
    机械硬盘结构
    机械硬盘的数据是存储在磁性特质的盘片上的,因此叫做磁盘。
    盘片

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

固态硬盘

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

文件系统

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

数据块

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

inode 结构

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

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

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.
HDFS

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

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

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

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

程序员开发者社区

程序员开发者社区

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值