欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由@从流域到海域翻译,发表于腾讯云+社区

map()和reduce()是在集群式设备上用来做大规模数据处理的方法,用户定义一个特定的映射,函数将使用该映射对一系列键值对进行处理,直接产生出一系列键值对。

Map Reduce和流处理

Hadoop的Map / Reduce模型在并行处理大量数据方面非常出色。它提供了一个通用的分区机制(基于数据的关键)来分配不同机器上的聚合式工作负载。基本上, map / reduce的算法设计都是关于如何在处理过程中的不同阶段为记录值选择正确的key。

然而,“时间维度”与数据的其他维度属性相比具有非常不同的特征,特别是在涉及实时数据处理时。它对面向批处理的Map/Reduce模型提出了一系列不同的挑战。

  1. 实时处理需要非常低的响应延迟,这意味着没有太多的数据能够在“时间”维度上进行处理。
  2. 从多个数据源收集到的数据可能没有全部到达汇总点。
  3. 在Map/Reduce的标准模型中,reduce阶段在map阶段完成之前无法启动。而且在下载到reducer之前,所有处理过程的中间数据都保存在磁盘中。所有这些都显著增加了处理的延迟。

尽管Hadoop Map/Reduce是针对批处理的工作负载而设计的,但某些应用程序(如欺诈检测,广告显示,网络监控需要实时响应以处理大量数据),现在已开始考虑各种调整Hadoop的方法以使其适合更实时的处理环境。在本篇文章中,我尝试了一些基于Map/Reduce模型的执行低延迟并行处理的技术。

常用流处理模型

在这个模型中,数据是在各种各样的OLTP系统中生成的,这些系统更新了事务数据存储,并异步发送其他数据用于分析处理。分析处理过程将输出写入到决策模型,该决策模型会将信息反馈给OLTP系统来进行实时决策。

注意与OLTP系统分离的分析处理的“异步性质”,在该方式下OLTP系统不会放慢速度等待分析处理完成。无论如何,我们仍然需要尽快进行分析处理,否则决策模型将不能反映当前世界的真实场景,它将不会很有用处。什么程度的延迟可容忍的是应用程序指定的。

在Map/Reduce中进行微批处理

一种方法是根据时间窗(例如每小时)将数据分成小批量,并将每批中收集的数据提交给Map/Reduce作业。这需要分段机制,以便OLTP应用程序可以继续独立于分析处理。而作业调度程序用于规范生产者和消费者,基于此它们每个生产者或消费者都可以独立进行。(生产者和消费者是在操作系统理论中对产生数据和处理数据的程序的称呼,译者注)

连续性Map/Reduce

这里让我们想象一下有关Map/Reduce执行模型的一些可能的修改,以使其适应实时流处理。我并不担心Hadoop在线原型(HOP)所采用的方法的向后兼容性 。

长时间运行

第一种修改方法是使mapper和reducer长时间运行。因此,我们不能等待map阶段结束之后才开始reduce阶段,因为map阶段永远不会结束。这意味着mapper在完成处理后会将数据推送到reducer,并让reducer对数据进行排序。这种方法的缺点是它没有机会去运行地图侧的combine()函数以降低带宽使用率。它还将更多的工作量转移到正需要进行分类的reducer。

注意在延迟和优化之间需要有一个折衷。优化需要更多的数据在源头(即Mapper)就进行累积,如此即可以执行本地合并(即:结合在一起)。不幸的是,低延迟需要尽快发送数据,因此没有太多时间使大量累积操作可以完成。

HOP提出了一种自适应流控制机制,在该方式下数据会被尽快推送到Reducer,直到Reducer被重载并退回(使用某种流量控制协议)。然后mapper将缓冲处理后的消息并在发送给reducer之前执行combine()函数。这种方法将会自动地来回移动Reducer和Mapper之间的聚合工作负载。

时间窗口:切片和范围

这是一个“时间片(time slice)”概念和一个“时间范围(time range)”的概念。“切片(Slice)”定义了执行reduce处理之前所累计结果的时间窗口。这也是mapper在发送到reducer之前应积累的最小数据量。

“范围(Range)”定义了结果所汇总的时间窗口。它可以是一个具有明确起点定义的界标窗口或者是跳跃窗口的(考虑移动的界标场景)。它也可以是一个滑动窗口,其中从当前时间开始聚合的固定大小的窗口。

在从每个mapper接收到特定时间片后,reducer可以启动聚合处理并将结果与之前的聚合结果进行合并。切片(大小)可以根据mapper发送的数据量来进行动态调整。

增量处理

请注意,reducer需要在收到所有mapper中相同时间片的所有记录后计算聚合片值。之后,它会调用用户定义的merge()函数将切片值与范围值合并。如果范围需要刷新(例如达到跳转窗口边界),将调用init()函数来获取刷新的范围值。如果范围值需要更新(当某个切片值超出滑动范围时),则会调用unmerge()函数。

以下是我们如何在每小时更新(即:一小时大小切片)的情况下,在24小时滑动窗口内跟踪平均命中率(即:每小时总命中数)的示例。

# Call at each hit record
map(k1, hitRecord) {
site = hitRecord.site
# lookup the slice of the particular key
slice = lookupSlice(site)
if (slice.time - now > 60.minutes) {
# Notify reducer whole slice of site is sent
advance(site, slice)
slice = lookupSlice(site)
}
emitIntermediate(site, slice, 1)
} combine(site, slice, countList) {
hitCount = 0
for count in countList {
hitCount += count
}
# Send the message to the downstream node
emitIntermediate(site, slice, hitCount)
}
# Called when reducer receive full slice from all mappers
reduce(site, slice, countList) {
hitCount = 0
for count in countList {
hitCount += count
}
sv = SliceValue.new
sv.hitCount = hitCount
return sv
} # Called at each jumping window boundary
init(slice) {
rangeValue = RangeValue.new
rangeValue.hitCount = 0
return rangeValue
} # Called after each reduce()
merge(rangeValue, slice, sliceValue) {
rangeValue.hitCount += sliceValue.hitCount
} # Called when a slice fall out the sliding window
unmerge(rangeValue, slice, sliceValue) {
rangeValue.hitCount -= sliceValue.hitCount
}

问答

比较好的MapReduce例子有哪些?

相关阅读

MapReduce极简教程

大数据运算模型 MapReduce 原理

如何为Hadoop选择最佳弹性MapReduce框架

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/developer/article/1122471?fromSource=waitui

Map Reduce和流处理的更多相关文章

  1. map reduce

    作者:Coldwings链接:https://www.zhihu.com/question/29936822/answer/48586327来源:知乎著作权归作者所有,转载请联系作者获得授权. 简单的 ...

  2. 分布式基础学习(2)分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...

  3. hadoop入门级总结二:Map/Reduce

    在上一篇博客:hadoop入门级总结一:HDFS中,简单的介绍了hadoop分布式文件系统HDFS的整体框架及文件写入读出机制.接下来,简要的总结一下hadoop的另外一大关键技术之一分布式计算框架: ...

  4. Hadoop Map/Reduce的工作流

    问题描述 我们的数据分析平台是单一的Map/Reduce过程,由于半年来不断地增加需求,导致了问题已经不是那么地简单,特别是在Reduce阶段,一些大对象会常驻内存.因此越来越顶不住压力了,当前内存问 ...

  5. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  6. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  7. 记一次MongoDB Map&Reduce入门操作

    需求说明 用Map&Reduce计算几个班级中,每个班级10岁和20岁之间学生的数量: 需求分析 学生表的字段: db.students.insert({classid:1, age:14, ...

  8. filter,map,reduce,lambda(python3)

    1.filter filter(function,sequence) 对sequence中的item依次执行function(item),将执行的结果为True(符合函数判断)的item组成一个lis ...

  9. python基础——map/reduce

    python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...

随机推荐

  1. Android4.2.2源码目录结构分析

    撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897277#t17 导读: 关于的Android目录分析,网上有很多资料,在此不 ...

  2. Java 反射之JDK动态代理

    Proxy提供用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类.如果我们在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类:如果需要为一个或多个接口动态的 ...

  3. 预装WIN8的电脑是GPT分区模式,无法安装WIN7

    本人的笔记本自带的是WIN8系统,现在想安装WIN7的系统,但是安装不了,提示"windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式". 通过上网搜索得知WIN7一般安装 ...

  4. UML之包图

    包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...

  5. 谈谈java虚拟机

    本文可作为北京圣思元深入java虚拟机的课堂笔记. 先看一个令人dan teng的面试题 public class Singleton { public static Singleton s=new ...

  6. 【生活随笔】Introspection of my life in 2014

       2014年已过去两星期,有写年度总结的必要了.今天特意看了看去年1月5日写的2013年度总结,看看都有些什么变化.我发现每年作一次总结是很有必要的,无赖恰逢考试周,连元旦都不能好好过,更不用说写 ...

  7. FFMPEG结构体分析:AVFormatContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  8. 网站开发进阶(十二)JS实现打印功能(包括打印预览、打印设置等)

    JS实现打印功能(包括打印预览.打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂在网上一阵搜索,搜到了很多相关的文章.其中绝大部分文章都是使用的Lodop5.0(Web打印和套打 ...

  9. bash下如何使用bind[En]

    You can determine the character sequence emitted by a key by pressing Ctrl-v at the command line, th ...

  10. SharePoint 搜索爬网第三方网站配置

    介绍:SharePoint的搜索着实强大,而且最近用到SharePoint搜索第三方爬网,感觉收获挺大,而且网上资料没找到太多类似的,就小记录一下,分享给大家. 首先,我自己写了一个net页面,里面读 ...