本科前几年就学过Hadoop, Spark 但是一直没有非常理解原理,今天看Bit Tiger 讲解有一点新的收获。
首先要了解背景:
在Hadoop出来之前,当时处理大数据情况都是把存储还是计算的机器分开的。 要处理数据的时候,Computing Cluster会从存储数据的storage里调取data来处理。但是computing是很expensive的,如果要把大部分能量花在IO 读取上就太浪费了。【以前听说computing 时间都是给人有限制使用的】
Count the word frequency of a web page
合并的时候很麻烦。
之后就想到把数据和计算放在同一个地方来弄。
NameNode基本算是管理员master一样。 查找数据什么的都要先问他,他知道index在哪里。
所以如何计算? 对于数单词这么一个简单的事情,Single Machine 肯定做不了 数据这么大的事情,因为memory放不下。【注意,这里面试经常考】
多线程在多台机器上计算也很难处理,效率也许很低,线程还可能挂掉。
Map_reduce 这个framework的出现帮助data science 的人可以专门只做分析,其他的不用操心。
还是有一个Master Node,底下一堆员工worker来干活。 master会监考进度, 员工效率。 不行的员工就kill了 重新launch一个新的来干活。
但是Hadoop map reduce效率也不是没有缺点:
因为Hadoop 数据存HDFS上, map的时候取出来一次, 中间map好又要放到Intermediate HDFS上, Reduce的时候又要读取出来再计算。而且这个过程也许会repeat好几次。略费时间。【这里我怎么觉得跟之前古老的计算存储分离没差很多。。。】
Spark 可以更好的解决Hadoop的问题:
Spark 在中间过程中不放回HDDFS,而是存放在Memory里,这样提取很快。【memory为什么放得下?】
与Hadoop不同,Spark会先计算出big picture 再行动。
当你给一个driver program的时候, Spark每一步都是不做计算而是构建一个direct graph, 优化整个运行路径。直到你说reduceByKey的时候才真正开始计算。这样的话 因为需要的东西都group在一起了,所以之后不需要再放回HDFS再读取。
最后, Databrick上似乎提供了一个Spark的玩耍服务,看起来不错。