声明:本文摘录自《大数据日知录——架构与算法》一书。算法
较常见的计算模式有4类,实际应用中大部分ETL任务均可以归结为这些计算模式或者变体。网络
1.求和模式架构
a.数值求和app
好比咱们熟悉的单词计数,即便该模式的一个应用。求最大最小值,求平均值皆属此类。ide
b.记录求和大数据
非数值内容的累加,造成队列。好比将包含某个key的网页添加到一个列表当中。设计
2.过滤模式排序
不对数据进行转换,只是从大量数据中筛选。接口
a.简单过滤队列
这类应用不须要对数据进行聚合(缘由不复杂),因此无需reduce阶段。
b.Top 10
和简单过滤的差别在于:简单过滤的条件判断只涉及当前记录,而Top k计算模式须要在记录之间进行比较,并得到全局最大的子集。
思路:map =>local top k =>reduce =>overall top k
3.组织数据模式
a.数据分片
重点在partitioner策略的设计上,经过改变partitioner来将相同标准的数据通过Shuffle过程放到一块儿,由同一个reducer 来输出。
问题来了,这该如何实现呢?
考虑到partitioner是能够自定义的(这TM不废话么),那么,咱们能够在partitioner内部实现对数据的分析,而后将其输出到不一样的partition中。
b.全局排序
能够直接利用内置排序过程,也就是说,mapper只须要将要排序的字段做为key,记录内容做为value输出便可。
reducer其实也不须要作额外的任务,由于sort过程已经排好序了。(有一个问题,假如我对排序算法不满意怎么办?一个办法是自定义key,也就是自定义一个WritableComparable接口的类,而且根据需求实现里面的compareTo方法)
若是有不止一个reducer怎么办?若是不作额外的处理,排序结果就会成为局部排序。
有办法:Partitioner,能够将处于不一样区间的key放在不一样的Partition,相同区间的Key放在同一Partition。
4.Join模式
a.Reduce-Side Join
这个过程对于笔者而言比较复杂,因此这个主题会耗费较多文字。
在选定外键以后,全部相同外键的数据分配到了同一个Reducer。须要注意的是如何区分来自不一样数据集合的记录?一个显而易见的办法是在Mapper阶段动动手脚:给记录作标记,放在Value中。
而后,将reducer的Value list根据集合的不一样整合成2个列表(或者哈希表,其实就是一个查询效率的问题,想怎么搞就怎么搞),而后再将这些数据进行Join。
多说一句:整个过程须要通过数轮磁盘的读写,shuffle阶段的网络传输,以及Reduce阶段的排序,因此计算效率比较低。(意思就是Mapper几乎什么事都没干,却由于IO的问题而致使时间效率低)
b.Map-Side Join
好了,效率低的解决办法来了;不过有前提条件:数据集合一个大一个小,而且小的那个彻底能够放入内存。
读者朋友,读到这里你应该想明白Map-side Join是怎么回事了吧!
这个问题到此告一段落!