启蒙
-
大数据的核心价值观
- 并行计算,分而治之
- 计算向数据移动
-
思考怎么使用单机去解决大数据问题
- 问题1:如果想要从100000个数字中去查询某一个数字是否存在
- 方法:遍历查询:(时间复杂度为O(n)
- 如果想要时间复杂度达到O(4)呢?(理想状态下)
- 思路:使用hash思想降低时间复杂度
- 做法:设计一个长度为25000的数组,每个数组存长度为4的链表来存储这100000个数据(假设这100000个数字可以均匀地分布在这个数组中)。把每个数字取其hash值模上25000,放进这个数组中。然后拿目标值取hash值模上25000,找到目标下标,遍历其中的链表。
- 结论:分开存储并且记录索引信息,可以降低算法时间复杂度。
- 问题2:如果有一个1T的文本文件,仅有一台内存为百M的计算机。如何查询出这个文本文件中那条记录出现了两次。
- tips:单机计算机的计算瓶颈为磁盘I/O。假设读取速度为每秒300M。那么读取一次1T的文件为约1个小时。
- 思路:因为内存有限,无法将数据完全读取到1台机器上。
- 方法1:逐条便利对比。需要n次遍历这个文本去逐条比对。时间是指数级别的。
- 方法2:分而治之:先遍历一次文本。将每条数据取hash值模上10000的方法,将每条数据分别存储到不同的10000个文件中。再遍历这10000个文件,相当于遍历一遍源文件。这样只需要两次I/O,2个小时左右就能解决这个问题。
- 如果想要将时间压缩到分钟级,甚至秒级。
- 思路:单台机子遍历1次I/O就需要3个小时。不可能单机做到。
- 拓展:只能依靠多机分布式。
- 思路1:将文件切割分发到10000台机器上,每台机器有100M的数据。并行去对本机的数据进行hash计算,排序。每台机子去抓取本机的hash值取模10000的数据,进行并行计算得出结论。
- 思考:多机器计算真的快吗?如果算上数据分发的时间呢。网络IO也是计算机计算的瓶颈之一。每秒100MB的网络分发速度加上。光分发速度就需要3个小时。那么多机器分布式计算真的块吗?
- 如果说每天都产生1T数据?每天都要对所有数据进行计算呢。当时间来到1个月后,单机和多机相比较哪个快。
- 结论:多机器块。在第30天的时候,数据来到了30T。单机遍历两次将近30个小时。而多机器呢:每天需要3个小时去分发数据。到最后,每台机器上也就将近3000MB的数据。遍历以及计算时间相对于3个小时接近忽略不计。
- 思考:那么如果数据的积累来到了1年呢?单机几乎就处理不了了。多机器仍旧能在1天内去计算解决。
- 问题1:如果想要从100000个数字中去查询某一个数字是否存在
-
思考:以上单机解决大数据问题的探索带来的结论。
- 结论1:
- 当数据量达到一定程度的规模时,普通的服务器很难短时间内去计算解决问题(需要很高成本的高级服务器才有可能)。所以需要多台廉价服务器分布式存储,并行计算去解决问题。
- 结论2:
- 分布式环境下,网络的I/O是多机处理问题的速度瓶颈。那么数据的移动的时间成本很大。而计算程序基本很小。所以我们需要计算去向数据移动。尽量使用本地数据,减少网络I/O。
- 结论1: