�Y:�ch如果提出这么一个需求:分析2.6TB的数据,找出其中最热的10个人名。这个需求看起来很简单,无非就是先读取文件,做一下分词处理,找出其中的人名,再累加计数,最后得出计数最多的人名。可是,这里有2.6TB的数据诶,如果处理速度是1MB/s,那么也得算个31.5天,等到那个时候,也许产品经理已经忘记了这个需求:)
为了不让产品经理忘记这个需求,那我们得加快处理速度了,一台机器处理不过来,那我们就堆机器吧,上个100台机器,总能在一天之内搞定吧。那么面对这100台机器,该如何分配任务,以及如何收集处理结果呢?这程序该怎么写呢?这就祭出今天要说的MapReduce了。
MapReduce是由Google提出的一个分布式计算模型,简单的说,就是把大量的数据分解成独立的单元执行(Map),然后将结果归并在一起(Reduce)。
面对上面的需求,首先需要做的事将任务分解了(Map)。可以有这样的一个独立的小任务,以单个文件作为一个输入,然后经过分词、人名筛选等处理后,得到很多Key-Value形式的键值对,这里的Key就是某个人名(张三),Value就是张三在这个文件中出现的次数。这种独立小任务的处理方式,对于2.6TB中的文件都是一模一样的,那么我们就把这些文件统统分配到其中90台机器上去单独执行这些小任务就好了。
另外10台机器干嘛呢?它们就负责Reduce,将计算结果归并起来,当前面90台机器处理完一个文件了,它就将处理结果扔给这10台机器。扔结果可不是乱扔掉哦,它有一个原则,相同Key的结果都往同一台机器上扔,如下图中画的那样,蓝色的处理结果,都扔给了第一台机器,这样它就保证了同一个Key的数据完整性。
最终,从全部Reduce的机器上,可以获得每个名字在这2.6TB数据中出现的统计结果,将其中次数最多的前10个列出来,就得到了我们想要的结果了。
说到底就是将大量重复独立的任务,分摊到不同的机器上去执行,分担了整体运行的时间。
文章来源:微信号:给产品经理讲技术
文章作者:凡夫畏果