一:概要模式

1:简介

概要设计模式更接近简单的MR应用,因为基于键将数据分组是MR范型的核心功能,所有的键将被分组汇入reducer中

本章涉及的概要模式有数值概要(numerical summarization),倒排索引(inverted index),计数器计数(counting with counter)

2:概要设计模式包含

2.1:关于Combiner和paritioner

combiner:reducer之前调用reducer函数,对数据进行聚合,极大的减少通过网络传输到reducer端的key/value数量,适用的条件是你可以任意的改变值的顺序,并且可以随意的将计算进行分组,同时需要注意的是一个combiner函数只对一个map函数有作用

partitioner:许多概要模式通过定制partitioner函数实现更优的将键值对分发到n个reducer中,着这样的需求场景会比较少,但如果任务的执行时间要求很高,数据量非常大,且存在数据倾斜的情况,定制partitioner将是非常有效的解决方案

源码分析请点击            编程实例请点击

2.2:数值概要模式

2.2.1:数值概要模式:计算数据聚合统计的一般性模式
        2.2.2:数值概要应用的场景需要满足以下亮点:
                  1:要处理的数据是数值数据或者计数
                   2:数据可以按照某些特定的字段分组
        2.2.3:适用场景:

1:单词计数 (可以使用combiner)
                   2:最大值/最小值/计数  (可以使用combiner)
                   3:平均值  (可以使用combiner,但必须做相应的处理,即迂回算法,举例如下)
                         给定用户的评论列表,按天计算每小时的评论长度
                         Map:context.write(1,tuple(1,1小时的平均长度))
                         reducer:
                                   处理:sum += tulpe.gethour * tuple.getavrg
                                              count += tuple.gethour
                                   输出:
                                        key=1
                                       value=sum/count
                   4:中位数/标准差

2.3:倒排索引概要

适用场景:通常用在需要快速搜索查询响应的场景,可以对一个查询结果进行预处理并存储在一个数据库中

倒排索引实战1         倒排索引实战2

2.4:计数器计数

已知应用

统计记录数:简单的对指定时间段的记录数进行统计是很常见的,统计小数量级的唯一实例计数
        汇总:用来执行对数据的某些字段进行汇总

二:过滤模式

1:简介

过滤模式也可以被认为是一种搜索形式,如果你对找出所有具备特定信息的记录感兴趣,就可以过滤掉不匹配搜索条件的其他记录,与大多数基础模式类似,过滤作为一种抽象模式为其他模式服务,过滤简单的对某一条记录进行评估,并基于某个条件作出判断,以确定当前这条记录是保留还是丢弃

2:适用场景

2.1:过滤, 使用过滤的唯一必要条件是数据可以被解析成记录,并可以通过非常特定的准则来确定它们是否需要保留,不需要reducer函数
近距离观察数据:准备一个特定的子集,子集中的记录有某些共同属性或者具备某些有趣的特性,需要进一步深入的分析。 
跟踪某个事件的线索:从一个较大数据集中抽取一个连续事件作为线索来做案例研究。
分布式grep:通过一个正则表达式匹配每一行,输出满足条件的行
数据清理:数据有时是畸形的,不完整的 或者是格式错误的,过滤可以用于验证每一条数据是否满足记录,将不满足的数据删除
 简单随机抽样:可以使用随机返回True or False的评估函数做过滤,可以通过调小true返回的概率实现对结果集合大小的控制
 移除低分值数据:将不满足某个特定阀值的记录过滤出去    
2.2:布隆过滤, 对每一条记录,抽取其中一个特征,如果抽取的特性是布隆过滤中所表示的值的集合成员,则保留记录  
移除大多数不受监视的值:最直接的使用案例是清楚不感兴趣的值
对成本很高的集合成员资格检查做数据的预先过滤:
2.3:Top10,不管输入数据的大小是多少,你都可以精确的知道输出的结果的记录数
异类分析:
选取感兴趣的数据:
引人注目的指标面板:
2.4:去重,过滤掉数据集中的相似数据,找出唯一的集合
数据去重: 代码举例
抽取重复值:
规避内连接的数据膨胀:

三:数据组织模式

1:分层结构模式

分层模式是从数据中创造出不同于原结构的新纪录
    适用场景:数据源被外部链接,数据是结构化的并且是基于行的
     <MultipleInputs类:用于指定多个Mapper任务进行不同格式文件的输入>

2:分区和分箱模式

分区:将记录进行分类(即分片,分区或者分箱),但他并不关心记录的顺序,目地是将数据集中相似的记录分成不同的,更小的数据集,在该模式下数据是通过自定义Map的分区器进行分区的。
     分箱:是在不考虑记录顺序的情况下对记录进行分类,目的是将数据集中每条记录归档到一个或者多个举例
     两者的不同之处在于分箱是在Map阶段对数据进行拆分,其好处是减少reduce的工作量,通常使资源分布更有效,缺点是每个mapper将为每个可能输出的箱子创建文件,对后续的分析十分不利

3:全排序和混排模式

全排序:关注的是数据从记录到记录的顺序,目的是能够按照指定的键进行并行排序。适用的范围是排序的键必须具有可比性只有这样数据才能被排序
     混排序:关注记录在数据集中的顺序,目的是将一个给定的记录完全随机化

4:数据生成模式

四:连接模式

SQL连接模式包括内连接和外连接

eg:A表  B表
 内连接:只连接两个表中都用的外键连接(eg 以ID作为连接键,只连接有相同ID)
 外连接:
1:做外连接
      以用户ID为外键的A+B做外连接   以A表为基准,A表数据全部显示,B表中不在A表中的ID显示为null
2:右外连接
     和做外连接相反
3:全外连接
      左外连接和右外连接的合并,有相同ID 的显示,没有相同ID的显示为NULL

反连接:全外连接减去内连接的结果

1:reduce端连接:

相当其他连接模式来讲用时最长,但是也是实现简单并且支持所有不同类型的操作
 适用场景:
1:多个大数据需要按一个外键做链接操作,如果除了一个数据集以外,其他所有的数据集都可以放入内存,可以尝试使用复制连接
        2:你需要灵活的执行任意类型的连接操作
     等效的SQL:Select user.id,user.location,comment.uprotes
                          from user
                          [inner | left | right] join comments
                          on user.id=comments.userid
        优化方案:可以使用布隆过滤器执行reduce端的连接

2:复制连接:

是一种特殊类型的连接操作,是在一个打的数据集和许多小的数据集之间通过MAP端执行的连接的操作,该模式完全消除了混排数据到reduce的需求
      适用场景:
           1:要执行的连接类型是由内连接或者左外连接,且大的输入数据集在连接操作符的“左边”时
           2:除一个大的数据集外,所有的数据集都可以存入每个Map任务的内存中
           性能分析:因为不需要reduce,因此在所有连接模式是最快的一种,代价是数据量,数据要能完全的储存在JVM中,这极大的受限于你愿意为每个Map和reduce分配多少内存

3:组合连接:

是一种非常特殊的连接操作,他可以在map端对许多非常大的格式化输入做连接,需要预先组织好的或者是使用特定的方式预处理过的,即在使用这个类型的连接操作之前,必须按照外键对数据集进行排序个分区,并以一种非常特殊的方式读入数据集

Hadoop通过CompositeInputFormat来支持组合连接方式
      仅适用于内连接和全外连,每一个mapper的输入都需要按照指定的方式做分区和排序,对于每一个输入数据集都要分成相同数目的分区,此外,对应于某个特定的外链所做的所有记录必须处于同一分区中
       通常情况下这发生在几个作业的输出有相同数量的reducer和相同的外键,并且输出文件是不可拆分的即不大于一个hdfs文件快的大小或是gzip压缩的
      适用场景:
          1:需要执行的是内连接或者全外连接
          2:所有的数据集都足够大
          3:所有的数据集都可以用相同的外键当mapper的输入键读取
          4:所有的数据集有相同的数据的分区
          5:数据集不会经常改变
          6:每一个分区都是按照外键排序的,并且所有的外键都出现在关联分区的每个数据集中

4:笛卡尔积:

是一种有效的将多个输入源的灭一个记录跟所有其他记录配对的方式
适用场景:
      1:需要分析各个记录的所有配对之间的关系
      2:没有其他方法可以解决这个问题
      3:对执行时间没有限制
            等效的SQL:SELECT * FROM t1,t2
            等效的PIG:CROSS a,b;

五:元模式

关于模式的模式

1:作业链

针对MapReduce处理小的文件时,优化的办法是可以在作业中始终执行CombineFileInputFormat加载间歇性的输出,
在进入mapper处理之前,CombineFileInputFormat会将小的块组合在一起形成较大的输入split

当执行做个作业的作业链时,可以使用job.submit方法代替job.waitForCompletion()来并行的启动多个作业,
调用submit方法后会立即返回至当前线程,而作业在后台运行,该方法允许一次执行多个任务, 
job.isComplete()是检查一个作业是否完成的非阻塞方法,该方法可以通过不断轮询的方式判断所有作业是否完成

如果检测到一个依赖的作业失败了,此时你应该退出整个作业链,而不是试图让他继续

示例:
(1)基本作业
(2)并行作业链
(3)关于Shelll脚本
(4)关于JobControl

2:链折叠

链折叠是应用于MapReduce作业链的一种优化方法,基本上他是一个经验法则,即每一条记录都可以提交至多个mapper或者一个reducer,然后再交给一个mapper
这种合并处理能够减少很多读取文件和传输数据的时间,
作业链的这种结构使得这种方法是可行的,因为map阶段是完全无法共享的,因此map并不关心数据的组织形式和或者数据有没有分组,在构建大的作业链时,通过
将作业链折叠,使得map阶段合并起来带来很大的性能提升
链折叠的主要优点是减少mapreduce管道中移动的数据量

作业链中有许多模式,可以通过下面介绍的这些方法来查找和确认哪些可以折叠
(1)看看作业链的map阶段,如果多个map阶段是相邻的,将他们合并到一个阶段
(2)如果作业链是以map阶段结束,将这个阶段移动到前一个reducer里边,他除去了写临时数据的IO操作,然后在reduce中执行只有map的作业,这同一也能减少任务启动的开销
(3)注意,作业链的第一个map阶段无法 从下一个优化中获益,尽可能的在减少数据量(如过滤)的操作和增加数据量(如丰富)的操作之间拆分每个map阶段(合并或者其他)

注意:(1)合并阶段需要大量的内存,例如将5个复制连接合并在一起可能不是一个好的选择,因为他将可能超过任务可用的总内存,在这些情况下,最好将这些操作分开
(2)不管一个作业是不是作业链,都要尽早尽可能的去过滤掉更多的数据,mr作业开销最大的部分通常都是管道推送数据:加载数据,混排/排序阶段,以及存储数据

实现折叠链有两种主要方法:
(1)手动裁剪然后将代码粘贴在一起
(2)使用特殊类ChainMapper和ChainReducer(特殊类介绍参考:http://www.iteye.com/topic/1134144)

3:作业归并

和作业链折叠一样,作业归并是另一种减少MR管道IO管道的优化方法,通过作业归并可以使得加载同一份数据的两个不相关作业共享MR管道,作业归并最主要的优点是数据只需要加载和解析一次。
先决条件是:两个作业必须有相同的中间键和输出格式,因为他们将共享管道,因而需要使用相同的数据类型,如果这的确是一个问题的话,可以使用序列化或者多态,但会增加复制度

作业归并步骤如下:
(1)将两个mapper代码放在一起
(2)在mapper中生成键和值时,需要用标签加以标记,以区别map源
(3)在reducer中,在解析出标签后使用if语句切换到相应的reducer代码中去执行
(4)使用multipleOutputs将作业的输出分来

六:输入输出模式

自定义输入与输出

在hadoop自定义输入和输出

Hadoop允许用户修改从磁盘加载数据的方式,修改方式有两种:

1:配置如何根据HDFS的块生成连续的输入分块,配置记录在map阶段如何实现。

为此将要用到的两个类即,RecordReader和InputFormat

2:hadoop也允许用户通过类似的方式修改数据的存储形式

通过OutputFormat和RecordWriter实现

1:生成数据

这个模式下是只有Map的

(1)InputFormat凭空创建split

(2)RecordReader读入虚的split并根据他生成随机记录

(3)某些情况下,能够在split中赋予一些信息,告诉recordreader生成什么

(4)通常情况下,IdentityMap仅仅将读入的数据原样输出

2:外部源输出

外部源输出详细描述:在作业提交之前,OutputFormat将验证作业配置中指定的输出规范。RecordReader负责将所有的键值对写入外部源

性能分析:必须小心数据接收者能否处理并行连接。有1000个任务将数据写入到单个SQL数据库中,者=这工作起来并不好,为避免这种情况你可能不得不让每个reducer多处理一些数据以减少写入到数据接收者的并行度,如果数据接收者支持并行写入,那么这未必是个问题。

3:外部源输入

在MapReduce中数据是以并行的方式加载而不是以串行的方式,为了能够大规模的读取数据,源需要有定义良好的边界

MR实现该模式的瓶颈将是数据源或网络,数据源对于多连接可能不具很好的扩展性,同时给定的数据源可能与MR集群的网络不在同一个网络环境下

4:分区裁剪

分区裁剪模式将通过配置决定框架如何选取输入split以及如何基于文件名过滤加载到MR作业的文件

描述:分区裁剪模式是在InputFormat中实现的,其中getsplit方法是我们需要特别注意的,因为他确定了要创建的输入split,进而确定map任务的个数,  RecordReader的实现依赖于数据是如何存储的


扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!


【技术服务】,详情点击查看:https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg


MapReduce设计模式学习相关推荐

  1. Apache Spark中实现的MapReduce设计模式

    该博客是该系列文章的第一篇,讨论了MapReduce设计模式一书中的一些设计模式,并展示了如何在Apache Spark(R)中实现这些模式. 在编写MapReduce或Spark程序时,考虑执行作业 ...

  2. 第2节 mapreduce深入学习:4, 5

    第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...

  3. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  4. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  5. Builder (建造者) — 【面向对象设计模式学习】

    Builder (建造者) - [面向对象设计模式学习] By CityWalker 2010年3月19日 Intent Separate the construction of a complex ...

  6. MapReduce设计模式

    本文讨论了四种主要的MapReduce设计模式: 1. Input-Map-Reduce-Output 2. Input-Map-Output 3. Input-Multiple Maps-Reduc ...

  7. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  8. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  9. 面向对象软件设计——设计模式学习

    工作也从开始C语言,转向现在的C++,表面上看得出,但实际中却没有把这种转变深入到思想中,究其原因还是对面向对象的软件设计不了解,有必要好好学习一下设计模式这个东东.本文就是设计模式学习第一篇-- 1 ...

最新文章

  1. 为你的AliOS Things应用增加自定义cli命令
  2. twisted 安装时,安装顺序为 zope.interface -twisted
  3. oracle数据库实践,RubyonRails连接Oracle数据库实践
  4. Java-整数相加求和
  5. 纺织品外观疵点及其成因分析大全
  6. 用R语言分析与预测员工离职
  7. mini139聊天软件
  8. maven 编译出错解决
  9. W5500以太网控制器芯片(五):实现FTP客户端
  10. 合天网安实验室CTF-Web100-Give Me Flag
  11. java使用drawtext重叠_DrawText的使用
  12. 眼界决定境界,你也可以
  13. 源生ajax同步异步请求,源生JS怎样实现文件异步上传
  14. Ubuntu16.04下的主题美化
  15. 9 WebMagic 入门案例
  16. 【Machine Learning】【Andrew Ng】- notes(Week 2: Computing Parameters Analytically)
  17. Codeforces Round #618 (Div. 2)C、Anu Has a Function
  18. 使用C语言根据年月日求星期(基姆拉尔森计算公式)。
  19. 更全面的对比GPT4和Claude对MLIR的掌握能力
  20. 动态设置video的宽高的方法,js设置和CSS设置

热门文章

  1. Biome-BGCMuso模型运行
  2. 校园网一号多设备两种方法
  3. waterdrop使用笔记
  4. Noesis.Javascript.dll 引用时报错“找不到指定的模块”
  5. 下列可作为python变量名的是_以下选项中能用作Python程序变量名的是____________。(2.5分)_学小易找答案...
  6. 用for循环遍历的六种情况
  7. Dynamics CRM 365使用 Excel 模板分析和共享您的数据
  8. svn出现skips remain conficted,不能更新代码问题
  9. 【Microsoft Whiteboard】微软白板 下载
  10. 初次遇见等待事件:enq;tx-row lock contention