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

文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限。 如果才能在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 分钟是可以实现的。

程序员开发者社区

at24c16如何划分出多个读写区_如何1分钟遍历100T数据?相关推荐

  1. at24c16如何划分出多个读写区_漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘...

    周末,我在家里面看电视,女朋友正在旁边鼓捣她的电脑,但是好像并不是很顺利,于是就有了以下对话. 计算机存储 我们使用的计算机中,保存信息的介质有两类: 一类是内部存储器,一断电就会把记住的东西丢失. ...

  2. at24c16如何划分出多个读写区_读写AT24C02,并用1602显示

    #include #include /*********************************LCD定义部分********************************/ //输入方式设 ...

  3. at24c16如何划分出多个读写区_51单片机向at24c16EPROM写入一个数据每问题,写入多个数据,读出的数据都一样...

    #include#defineucharunsignedcharsbitsda=P2^0;sbitscl=P2^1;uchara;voiddelay(){;;}voidstart()//开始信号{sd ...

  4. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  5. 什么是堆栈?内存中划分出按FIL0方式操作的特殊区域,叫做堆栈

    内存中划分出按FIL0方式操作的特殊区域,叫做堆栈 有两个操作,分为压栈,出栈 每次压栈和出栈以字为单位. SS存放段基值,SP存放栈顶单元偏移量 SS:SP构成堆栈指针 物理地址SSx16+SP 常 ...

  6. 长安二中计算机学院,最新!第一波中考录取分数线出炉!长安区12所高中录取分数线正式公布!...

    原标题:最新!第一波中考录取分数线出炉!长安区12所高中录取分数线正式公布! 8月1日,长安区正式公布本区12所高中录取分数线信息. 从分数线情况来看,长安区2017中考录取分数线最高的为长安一中60 ...

  7. 深耕技术的同时,别忘了走出自己的舒适区

    01 最近认识一个大学生,一个让我觉得非常厉害的大学生--有三个工作室,还有一间店铺:月收入具体有多少,我红着脸不敢问,据他自己说这一周光投资区块链就亏损了一万八! 听他侃侃而谈的时候,总有一根神经在 ...

  8. 城市划分出炉 客户等级划分好了吗?

    近日一二三线城市最新划分出炉,一线城市5个,二线发达城市8个,二线中等城市15个等等,对此,网民们的评论热闹非凡,键盘侠字字珠玑,表达着自己内心的感慨,或愉悦,或不快,或只是中立看待. 有人说,一二三 ...

  9. 数据存储方式_详解西门子S7-200PLC的数据区

    (一)数字量输入和输出映象区 1.输入映象寄存器(数字量输入映象区)(I) 数字量输入映象区是S7-200CPU为输入端信号状态开辟的一个存储区.输入映像寄存器的标识符为I,在每个扫描周期的开始,CP ...

最新文章

  1. 如何将Java源代码文件的编码从GBK转为UTF-8?
  2. java acr122 读取数据_使用ACR122U 从NTAG203Chip 读取数据
  3. 'pip' 不是内部或外部命令,也不是可运行的程序
  4. 闲话能力管理(Capacity Management)
  5. android 上滑隐藏view,Android CoordinatorLayout + AppBarLayout(向上滚动隐藏指定的View)
  6. LFS 8.3 中文翻译版本发布!
  7. 线程池---多线程学习笔记(三)
  8. webpack快速学习1
  9. 持续集成部署Jenkins工作笔记0021---21.关闭防止跨站点请求伪造
  10. 深入浅出MFC 读书笔记1
  11. Rust 程序语言资料
  12. VB2010(17)_消息对话框MessageBox
  13. 产品开发流程的几个主要阶段
  14. 《数据库原理》——知识点总结(期末复习)
  15. “枪型思维”产品设计新探索 | 基金持仓诊断
  16. 2021-2022年小学期 程序设计开发实践 随堂笔记
  17. ForgivingExceptionHandler: An unexpected connection driver error occured (Exception message: Socket
  18. windows 7z windows cannot create symbolic link : 客户端没有所需的特权。
  19. 华大HC32L130 SPI和GPIO模拟驱动NF-03和NF-01-s模块(SI24R1方案,兼容NRF24L01)
  20. Android实现滑动的几种方式

热门文章

  1. 短视频个性化Push工程精进之路
  2. SpringBoot自适应异常处理
  3. 推荐一位高性能服务开发专家!是他让我从专科,蜕变为年薪百万后端开发!...
  4. 那位五十多岁的创业者给我的启示!
  5. 关于MySQL线程池,这也许是目前最全面的实用帖!
  6. 学习一下国际巨头互联网公司的一些运营与管理思路!
  7. 什么是体系化?为什么要体系化架构
  8. SQL与NoSQL区别-存储方式
  9. 嵌入式系统中时间的应用以及rtc的验证过程
  10. php排序数组排序_PHP 数组排序