hadoop

需求  有一个非常大的文本文件 里面有很多行,只有两行一样
他们出现在未知的位置 需要查找到他们
单机 而且可用内存很好  也就几十兆
复制代码
1 假设文件是  1TB 无法用内存全量装取
2 假设IO 速度是500MB每秒  那么我们可以得出 内存的速度是 磁盘IO的10万倍
1s=1000ms(磁盘)
1ms=1000000ns(内存)

机械硬盘 100mb/s 
固态 500mb/s
PCI/E 1G/s

1 原始方法:读出文件第一行放进内存 继续读取 与内存中的进行比较
有可能一遍读取下来没有与第一行相同的内容   相当于一次就走了一次全量的IO
1TB=1000G=2000个 500MB=2000秒=30分钟
接下来 比较下面的内容  最大复杂度是最后两行内容相同  那么30N


2 简单方法 每次读一行放一行 拿出这一行 算出他的hashCode % 2000(这个数自己定义 越大越好)
这个值 一定是固定的 如果%上2000 那么会得到2000个小文件 0-1999
每一行 根据上面的算法 进入到不同的小文件中 其中相同内容的hashCode相同
%2000也会相同 必然会在同一个文件中出现
最快 30分钟 + 1s
最慢 30分钟 + 30分钟
复制代码

 

复制代码
 如果这1TB的文件中放的都是数字 这些数字是乱序
要求:将这个文件中的数字 做全排序
方法1:
每次取出1个数值  
如果这个数 x>0 && x<=100 放入1号文件中
如果这个数值x>100&&x<200 放入2号文件中
.....
这些小文件 外部是有序  内部是无序的
30分钟后  会得到一个 外部有序 内部无序的文件
然后将第一个小文件放进内存 进行排序 
然后将第二个小文件放进内存 进行排序 追加到上一个文件末尾
此时也需要 2个30分钟

方法2
每次读50MB数据
放入内存 在内存做一次排序 生成0号文件
再从下面取出50MB 排序 生成1号文件
此时 这个文件是外部无序 内部有序(当听到 外部无序 内部有序 归并排序算法)
复制代码

 

 归并排序算法

需要三个变量

将三个文件的IO 放入变量中 (同时取出三个变量)

 

 将三个变量 比较 选出最小的  那么1被选出  清空1所在的位置  读取下面的元素 3

 

 然后在 3 2 7中比较  选出最小的数据 2  放入集合中

2 取走后  将4 取出 比较3 4 7  3最小 放入集合中 读取5

 

 

----------------------------------------------

如果要让时间 变为 分钟、秒级别

 

复制代码
如果将 1TB文件 用2000台机器存储
每台机器存储 500MB(1/2000)
因为磁盘IO 为500MB/s 因此只需要花费1秒读取
我们将 上面的程序拷贝到2000台机器上面
这2000台 面向自己的500MB数据可以同时启动
500MB 读取数据 hashCode()%2000 算出重复行
并行计算  1秒读取
因为是 多机计算重复行 有可能相同的行 在不同的机器中
因此我们需要将相同的0号文件放到相同的机器中 让重复的行相遇

此时就增加了节点与节点之间的拷贝数据的过程
那么 切割之后的分散在各个机器中的小文件也是500MB
也就是每台主机需要损耗500MB传输时间(并行拉取)
假设网卡是100MB传输速度 拉取500MB数据需要5秒时间

在拉取完数据之后 各个机器之间 查找重复行 判定0号文件有重复行不需要1号文件中的任何文件
因此 各个节点都是并行的执行 500MB 此时需要1秒(内存是磁盘的1000000倍 因此基本上不需要多少时间) 

但是我们忽略了一个问题 将1TB的文件分发到2000个机器中 此时也是需要损耗时间的
我们之前知道 磁盘IO 500MB/s 但是分发到2000个机器中 此时消耗的是网络IO 100MB/s
因此 需要消耗 磁盘传输1TB消耗时间 30MIN 网络传输1TB 消耗30Min*5=150Min 将近 3小时
此时我们发现 多机的 效率 低于 单机的效率 (计算向数据移动)
2000台真的比一台速度快吗?
在刚开始时 单机速度快 当文件增大时 多机速度快
如果考虑分发上传文件时间呢?
多机 慢于 单机
如果考虑每天都有1TB的数据产生呢?
如果 第一天来了1TB的数据 单机 2个30min(最慢找到重复行)
   第二天来了1TB的数据 2T 数据 4个30min
如果 是集群 需要 3小时(30min*5 网络IO 将近30分钟)1s+1s
第二天 来了1TB数据 1s 这里将1TB数据分为2000份 没份500MB 只需要1s
第三天 来了1TB数据
如果增量了一年 最后一天计算数据呢?
复制代码

 

posted @   花心大萝卜li  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示