启蒙很重要
学习知识的时候要搞明白它存在的意义,这样学习成本才会低。
分治思想
需求案例介绍
需求:
有一万个元素,可以是数字或汉字,用来存储。
问题:
-
如果查找某一个元素,最简单的遍历方式复杂度是多少? 答案是
O(n)
复杂度非常高
-
如果我们期望复杂度是
O(4)
呢?
复杂度O(4)的意思是,我们只需要比较判断4次就可以找到某一个元素。
解决思路: -
开辟一个数组+链表的存储结构。数组的长度是2500
-
将我们1万个元素通过
hashCode % 2500
得到一个数值最为数字下标,存入该下标的链表中(假设没有发生冲突,正好2500个数字下对应一个长度为4的链表)。 -
在查找某个元素的时候,通过
hashCode % 2500
就可以得到数组下标,遍历下标的链表就可以找到某个元素,时间复杂的就是O(4)
。 这里主要说明的是分治思想。去感受他是如何减少复杂度。
分治思想出现在那些地方
Redis集群
ElasticSearch
Hbase
HADOOP生态无处不在
单机处理大数据问题
想成为大神,就要把单机高深入,榨干单机性能。
需求案例介绍
需求:
又一个非常大的文本文件,里面有很多很多的行,其中只有两行数据是一样,他们分布在未知的位置,需要找到他们。给你一台机器,而且内存只有64M,只使用java se,不可用数据等其他软件,请问如何解决?
前置准备知识
假设IO的速度是500MB每秒(固体硬盘的读取速度),1T大小的文件读取一遍需要大约30分钟。如果用循环遍历的话,就像冒泡排序,时间复杂度是O()次IO。如果使用分治思想可以达到时间复杂度为2次IO读取整个文件。
内存寻址比IO寻址快10万倍。
内存寻址时间是纳秒级别
磁盘寻址时间的毫秒级别
计算机中除了CPU和内存都叫IO设备。网卡也属于IO设备。
计算机的IO是他最大的一个瓶颈
如果想成为一个高级的程序员,那么在IO上需要做很多的功课。通过技术手段规避IO,你就可以迈向高级程序员。在工作中以后慢慢悟。
解决思路:
- 读取一行字符串,计算出hashCode % 2000得到一个小于2000的数,将这数作为一个新文件的名称,并把这一行数据写入该文件。假设最后会得到2000个小文件。
- hashCode是稳定的,当我们算两个相同的字符串时,会得到相同的hashCode,所以相同的字符串会归类到一个小文件里。
- 然后在将一个一个的小文件读入内存,进行判断是否有重复的行。
- 最差也会在最后一个小文件中找到重复行。
- 时间复杂度就是读两次1TB的文件。 需求2:
假设1TB的文件里存着乱序的数字,让你排序如何实现?
解题思路1:
- 读取一个数,判断是否x>0 && x<=100,是就放入第0号小文件里
- 如果不是,则判断是否x>100 && x<=200,是就放入第1号小文件里
- 依次类推。
- 得到很多小文件,小文件的关系是有序的。
- 我们只需要把文件内部的数字排序,就可以得到全排序。
解题思路2:
- 按照文件大小去读取,一次读取50M的数据,并排序后存入一个小文件中。
- 再次读取50M的数据,排序后存入一个小文件中。
- 依次类推。
- 得到很多个50M的内部有序的小文件。1T的数据大约得到21000个小文件。
- 使用归并排序算法进行归并。然后我们在内存开辟出1000个整数存储空间,每一个空间对应上一个50M的小文件。
- 1000个空间分别去对应的小文件中读入一个数,然后取出1000个空间里最小的数(取出后要从小在该位置对应的小文件里读入下一个数),存入到另一个50M*1000的文件中,可以用链表存,存的过程是有序的。
- 重复第6步21一次就把21000个小文件转化成了21个50000M的中文件。
- 然后内存再次开辟21个整数存储空间,每个空间对应一个中文件。
如何在分钟或几秒钟内完成上面的事情
你可以明确的告诉我,如果还是单机处理,是完全不可能的。
sap公司的hana内存计算平台,他的内存初始大小是2T。他们的产品是软硬件捆绑售卖,价格预计是2E。
由于他的价格很贵,所以大数据开业技术才被收关注。
如果在分钟级别内实现,必须在多台机器的情况下实现。
解题思路:
- 最好的划分是根据磁盘1秒读取的最大数量来划分。比如最大每秒读取500M。
- 2000太机器分别处理500M的数据。同时工作。并行计算。粗略判断这里只需要1秒
- 每台机器计算出各自的小文件之后。我们要将所以机器的0号文件放入一台机器中处理。所有1号文件的数据要放入一台机器中处理。依此类推。最终让重复的行相遇。
- 假设每台机器得出的0号数据是均匀的,那么2000太机器的数据就是500M。所以每台整合的主机需要损耗500M网络传输的时间。这里也可以是并行拉取的。
- 假设网卡传输速度是100M每秒。拉取500M需要5秒钟。假设通过网络拉去整合小文件需要用60秒
- 之后每台主机只需要负责自己所对应的几号数据去判断是否有重复行,可以并行处理。这时候又是500M,IO的速度就是1秒
- 最后粗略计算得到结果只需要 62秒。
- 这里我们忽略了一个问题,就是1T的数据通过网络分发的时间损耗。如果网络传输每秒100M,那么时间损耗可能是170分钟左右。
- 所以在少量的数据下是不能体现出他的优势的。
集群分布式处理大数据的辩证
2000台机器真的比1台速度快吗?
如果是固定数据,只算一次,可能不一定速度快。但是如果每天的数据是递增的,每天都要计算一次,那可能是比1台速度快。
例如支付宝每年会发给用于一个账单。
网易云音乐元旦那天会给用户一个一年听的最多的歌。
这些计算一定是用大数据技术。
如果考虑分发上传文件的时间的?
文件分发是要根据网卡传输速度计算。这里的时间损耗是比较大的。如果是增量很大的场景情况下,我们每次只需要分发增量部分的数据。所以久而久之分发的耗时会分散到每一天,而单机处理就是把读取时间集中到了一个时间段。
如果考虑每天都有1T数据的产生呢?
单机处理
当我们的数据每日递增1T到5T的时候:
读入数据并处理需要60分钟5
当我们的数据每日递增1T到365T的时候
读入数据并处理需要60分钟365 = 365小时 = 15.21天才能计算完。
多机处理
当我们的数据每日递增1T到5T的时候:
而多机只需要分发当天递增的1T数据,耗时3小时。
当我们的数据每日递增1T到365T的时候
多机只需要分发当天递增的1T数据,耗时3小时。 哪怕因为单机处理的数据过多,耗时增加也是比较可以接受的。
如果增量了1年,最后一天计算数据呢?
增量越大,多台机器的优势就越明显。
结论
分治,并行计算,计算向数据移动,数据本地化读取。
以上都是学大数据技术的重点关注点。