MapReduce 四种基本设计模式
langbo213
8年前
<p>这篇文章讨论了 MapReduce design patterns的四种基本设计模式:</p> <p>1. Input-Map-Reduce-Output</p> <p>2. Input-Map-Output</p> <p>3. Input-Multiple Maps-Reduce-Output</p> <p>4. Input-Map-Combiner-Reduce-Output</p> <p>下面是一些真实场景,帮助你理解,什么时候使用那种模式更为恰当。</p> <h2><strong>Input-Map-Reduce-Output</strong></h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/e9f5e1893f8962fb47cfc70417f140d9.png"></p> <p>如果需要进行聚合操作,就要使用到这种模式。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/9e4c419dcf6f5bd8f76ded431000b658.png"> <img src="https://simg.open-open.com/show/7d23ef5f4508eedab071a43cc4de5648.png"></p> <p>为了计算不同性别人员的总工资,我们需要生成以性别为键,以薪水为值的键值对,键值对进行Map操作的结果如下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/0f8105baee4fa630434ddee76201b327.png"></p> <p>将相同key的value放到一个集合中,给Reduce操作提供以下数据:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/2160850a3a172ef96f7625653e0213c4.png"></p> <p>Reduce操作后的结果如下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/fd87fa34eb575f009156db376fbf3951.png"></p> <h2><strong>Input-Map-Output</strong></h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/b96c17a9c36865123b683410cdc580c1.png"></p> <p>Reduce操作最常见的用法是 <u>集合计算</u> ,如果仅仅希望改变数据格式,那么使用Input-Map-Output模式。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/a1da11a8d65168ff41ff0f089c4b3c11.png"> <img src="https://simg.open-open.com/show/c2c1433e53805571c2b8afb34c28124b.png"></p> <p>在Input-Multiple Maps-Reduce-Output设计模式中,我们从2个文件中获取数据,每个有不同的语法,(注意:虽然是多个文件,但是有相同的语法,那么没有必要使用2个映射器,我们可以简单的提供不同的输入文件路径解决,在一个映射器中使用相同的逻辑即可。)</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/5a52e603498772dd430ae20f803a68d4.png"></p> <p>这个模式也被在 <strong>Reduce-Side Join</strong> 中使用:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/47f375564774930d4c2d39d3358abb6f.png"></p> <h2><strong>Input-Map-Combiner-Reduce-Output</strong></h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/ed33f8fd72c5172c8fa73541fe9bd663.png"></p> <p>Apache Spark 对于操作大和小的数据处理任务是非常高效的,不仅仅因为它重新造了轮子,而且它放大了进行有效分析的现有工具。它在商用级硬件上的高度可扩展性,和其他知名大数据处理引擎相比,它拥有令人难以置信的性能,Spark可能终将让软件蚕食世界。</p> <p>Combiner,也被称为半个Reduce,是一个可选的类,它接收Map类的输入然后将键值对传递给Reducer类。Combiner函数的目的是降低Reducer的工作量。</p> <p>在一个MapReduce程序里, 20%的工作在Map阶段完成, 这也是一个数据准备的阶段,这个阶段的工作是并行进行的。</p> <p>80% 的工作在Reducer阶段完成, 这也称为计算阶段.。这个阶段工作不是并行进行的,所以比Map阶段慢。为了减少计算时间,可以将Reducer阶段的部分工作移动到Combiner阶段完成。</p> <h3>Scenario</h3> <p>现有多个部门,我们需要按照不同部门计算总工资,然后再按照性别计算总工资。而且,在计算总和时还有额外的条件。按性别计算各部门的总数之后:</p> <p>如果总部门工资大于200K,在总数上增加25K。</p> <p>如果总部门工资大于100K,在总数上增加10K。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/054559d165263133c5460d80ac2d78d5.png"></p> <p> </p> <p>来自:https://coyee.com/article/11094-mapreduce-design-patterns</p> <p> </p>