写在前面: 学习大数据之前,首先要具备分而治之的思想。并且在了解分布式之前,还需要了解如何用单机来处理大数据问题。因为分布式的本质还是要榨干每台单机的性能。
分而治之思想
现在有这样一个需求:有一万个元素需要储存,如果要查找其中某个元素,最简单的遍历方式复杂度是多少?如果期望复杂度事O(4)应该怎么做?
最简单的遍历方式很显然复杂度为O(n),即挨个查找。若期望复杂度事O(4),则需要将数据分为4份,并行着去每份数据中查找。将数据分为四份的方式有很多,这里可以用计算hashCode再进行取模的方式来分。即elem.hashCode % 2500即可分为四份。
单机处理大数据问题
需求: 一个文本文件,大小为1T,其中只有两行一样,并且出现在未知位置,如何查找到这两行?
如果直接对文件进行遍历,假设我们使用的磁盘IO速度是500MB每秒,遍历一次文件需要约30分钟,循环遍历需要N次30分钟,耗时可想而知。
由于内存寻址比磁盘IO寻址块10万倍,于是想到将文件放入内存中进行计算,但是服务器的内存大小又有限制。那么我们可以将文件通过readLing().hashCode % 2000的方式存入2000个文件中,每个文件大约500MB,此时就可以将文件放入内存进行计算。另外,相同两行的hashCode一定是相同的,所以不需要跨文件进行比对,一个文件中就能找到相同的两行。
以上是单机的方式来通过分治的思想提升计算速率。
需求: 以上需求改为将文件行排序。
此时计算hashCode的方式就行不通了。可以之间将文件拆分为若干文件,分别载入内存进行排序,最后再通过归并的方式即可快速排序。
集群处理大数据问题
需求: 一个文本文件,大小为1T,其中只有两行一样,并且出现在未知位置,如何查找到这两行?
如果用集群来处理问题,则可以将1T数据分至2000台机器,每台存储约500M的数据,然后再并行地将500M的数据通过readLing().hashCode % 2000分为2000份,每台机器的处理逻辑和单机处理时一样。最后将每台机器hashCode一致的文件拉取到同一台机器进行比较,最终并行判断各自的数据。
大数据技术的重点
- 分而治之
- 并行计算
- 计算向数据移动
- 数据本地化读取
无论是对Hadoop的学习还是其他分布式框架的学习,都需要重点关注这以上四点。