写的不到位的地方,欢迎评论指出不足之处
单机处理
假设 | 有一个 1T的文件 I/O 磁盘处理速度是 500MB/s (机器硬盘:100+MB/s、固态硬盘:500MB/s、高速接口:1G - 3G/s ) |
分析 | 1T 约 1000GB、1GB = 1000MB、1000GB = 500MB * 2000、即 2000秒 2000秒 / 60秒 约 30分钟 即:循环一次需要30分钟,若一直找不到匹配数据,就要一直循环下去(30分钟 * N次) |
规避I/O提高效率
一种 (重复字符串) | 文件每次读取一行 readLine().hashCode % 数量 (hashCode的值是唯一的,数量决定需要分割成多少块) 切割数量越多,内存压力越小,结果的数值一定小于数量 只有重复的数据,结果才会是一样的,才会分散到相同的块里 之后再对小文件进行处理 即:readLine进行一遍 对所有小文件进行一遍 共计时长:60分钟 注:适用不是数值,不用排序时,可做散列特征 |
二种 (数值全排序) | hashCode 不适用:读一行数值为3,hashCode 后会影响原数据特征 readLine() 进行判断数值区间,然后根据区间分散到指定块中 再对所有块分别进行内部排序,在新的文件中追加数据 即:readLine进行一遍 对所有小文件进行一遍 共计时长:60分钟 注:外部有序(按区域排序),内部无序(排序乱序) |
三种 (数值全排序) | 利用数据结构 如:每次读取 50MB数据 ,进行排序后放在一个块中 外部无序(第1块里有:1、2、100、500,第二块:3、4、5、6),内部有序(排序后才形成的) |
多机处理
简易说明:
- 1T文件切割2000份,每份500MB,交于2000台机器处理。
- HashCode % 数量:相当于要切割多少块,只有内容一样其结果才会一致,才会放入相同的块中
- 假设数据均匀
- 1号机:负责将1号块的内容,从所有机器上拉取回来,然后再进行数据处理
- 2号机:负责处理2号块......
- 以此类推
- 最后可得出结果或是全排序
注:
- 多机处理在数据分割和数据拉取合并时,时间相对会长,而数据处理时,由于已经分成很多块,容量变小,处理速度就会很快。速度快慢与硬件IO、网络等因素有关
- 临时处理数据,之后不再使用,适用单机处理