Map Reduce和流处理

2023-10-29

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

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

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Map Reduce和流处理 的相关文章

随机推荐

  • 模拟电路试题

    模拟电路 1 基尔霍夫定理的内容是什么 仕兰微电子 a 基尔霍夫电流定律 在电路的任一节点 流入 流出该节点电流的代数和为零b 基尔霍夫电压定律 在电路中的任一闭合电路 电压的代数和为零 2 平板电容公式 C S 4 kd 3 三极管曲线特
  • Android 九宫格布局(图片上传、预览)

    前言 利用RecyclerView展示朋友圈UI布局 包含展示 预览 删除等功能 效果图 1 在项目app build gradle添加依赖 图片加载 implementation com github bumptech glide gli
  • cesium与three.js 结合的栗子,结合了一下网友们的栗子,解决了three.js 高版本模型出不来的问题

    废话不多说先上图 下面是源代码
  • 清理水草 蓝桥杯模拟

    问题描述 小蓝有一个 n m 大小的矩形水域 小蓝将这个水域划分为 n 行 m 列 行数从 1 到 n 标号 列数从 1 到 m 标号 每行和每列的宽度都是单位 1 现在 这个水域长满了水草 小蓝要清理水草 每次 小蓝可以清理一块矩形的区域
  • VS编译错误:mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file

    一 问题描述 今天在用DDK编译一个驱动时出现以下错误 1 gt 已启动生成 项目 DriverDev 配置 Driver Check Edtion Win32 1 gt 正在链接 1 gt 正在嵌入清单 1 gt mt exe gener
  • 第二节课笔记(基本知识)

    基本知识 变量 的命名和使用 变量名只能包含字母 数字和下划线 变量名可以字母或下划线打头 但不能以数字头 例如 可将变量命名为message 1 但不能将其命名为1 messageo 变量名不能包含空格 但可使用下划线来分隔其中的单词 例
  • 车辆总线-MVB通讯

    概述 MVB Multifunction vehicle bus 为多功能车辆总线 它是列车通信网 TCN Train Communication Network 的一部分 TCN 网络由 WTB Wire Train Bus MVB 构成
  • Q-learning 理解以及简单实现

    强化学习 reinforcement learning 的过程 强化学习中有状态 state 动作 action 奖赏 reward 这三个要素 智能体需要根据当前状态来采取动作 获得相应的奖赏之后 再去改进这些动作 使得下次再到相同状态时
  • MoviePy介绍

    MoivePy是一个用于视频编辑的Python库 可以 剪切 拼接 标题插入 视频合成 视频处理和创建自定义效果 它支持Windows Linux Mac 源码地址 https github com Zulko moviepy 最新发布版本
  • 前端如何调用后端接口进行数据交互(极简)

    前端调用后端接口 获得数据并渲染 一 介绍 一个完善的系统 前后端交互是必不可少的 这个过程可以分成下面几步 前端向后端发起请求 后端接口接收前端的参数后 开始层层调用方法处理数据 后端将最终数据返回给前端接口 前端请求成功后 将数据渲染至
  • ubuntu安装tomcat7

    1 上传tomcat7源码包 百度云盘链接 https pan baidu com s 1Yo4DVOcm667F iKhGwpPBw 密码 ce1h 2 先安装 JDK cd opt tar zxvf jdk 8u161 linux x6
  • 解决GitHub密码授权访问即将失效的问题

    解决GitHub密码授权访问即将失效的问题 前言 1 网络中的解决方法 2 GitHub密码授权弃用通知 3 创建个人访问令牌 4 IDEA设置Token访问GitHub 4 1 忘记密码 4 2 Token授权 5 GitHub 客户端
  • 非Unicode程序创建非本地字符集的文件路径

    开发中需要用到纯MFC的程序完成整包的文件释放 过程大概是根据整包中的文件路径记录在当前执行路径下建立子目录 创建文件 然后将整包中的内存数据写入该文件 正常英文或中文系统下路径创建及文件读写都没有遇到问题 但在路径名称或文件名称出现非本地
  • 前端常见的适配方法

    作为一个真正的前端攻城狮 我们经常会谈到web前端怎么做适配 然而平常经常做的事 一旦问起来突然好像脑子一片空白 只能想到rem flex 媒体查询那些 因此想记录一篇文章以此警醒自己 一 固定布局 pc端 静态布局 以像素作为页面的基本单
  • 谁在为网络安全制造标尺?

    我们想帮助企业往后退一步 去全局的看一下自己的安全能力建设水平如何 以及在当下的阶段最应该做的安全建设是什么 度量 对应的是更清晰的认知 而对企业安全而言 这种认知 也更在成为一把新的标尺 作者 皮爷 出品 产业家 6月开始 吕一平开始频繁
  • MySQL存储引擎:MyISAM和InnoDB区别详解

    1 MyISAM和InnoDB区别 1 1 区别 InnoDB MyISAM 构造 由 frm文件 表空间 分为独立表空间或者共享表空间 和日志文件 redo log 组成 MyISAM在磁盘上存储成三个文件 其中 frm文件存储表定义 M
  • 百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)、和 WGS-84 坐标系之间的转换

    百度坐标 BD 09 国测局坐标 火星坐标 GCJ 02 和 WGS 84 坐标系之间的转换 Created by Wandergis on 2015 7 8 提供了百度坐标 BD 09 国测局坐标 火星坐标 GCJ 02 和 WGS 84
  • CentOS 7安装Zabbix 4.4

    我们当前部署Zabbix是在Centos7的基础上部署Zabbix4 4版本 我的服务器配置是双路四核CPU 8GBRAM 以下安装步骤仅供参考 大家也可以参考官方资料 https www zabbix com documentation
  • 142 环形链表

    142 环形链表 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 重点在于如何判断是否有环 采用快慢指针的做法 快指针每次走2步 慢指针每次走1步 快指针相对慢指针每次多走一步 这样确保如果有环
  • Map Reduce和流处理

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由 从流域到海域翻译 发表于腾讯云 社区 map 和reduce 是在集群式设备上用来做大规模数据处理的方法 用户定义一个特定的映射 函数将使用该映射对一系列键值对进行处理 直接