《数据密集型应用系统设计》读书笔记——第三部分 派生数据(一)

第三部分 派生数据

存储与处理数据的系统按照高层次分类可以分为两大类:

  • 记录系统
    记录系统,也被称为真相源、真实数据系统,持有数据的权威版本。当新的数据进⼊时,首先会记录在这里。每个记录在系统中只表示一次(通常是规范化表示)。如果其他系统和记录系统之间存在任何差异,那么以记录系统的值为准。
  • 派生数据系统
    派生数据系统中的数据,通常是另一个系统中的现有数据以某种⽅式进行转换或处理的结果。如果派生数据丢失,可以从原始来源重新构建。典型的例子是缓存:如果数据在缓存中,就可以由缓存提供服务;如果缓存不包含所需数据,则降级由底层数据库提供。非规范化的值,索引和物化视图亦属此类。在推荐系统中,预测汇总数据通常派生自用户日志。

从技术上讲,派生数据是冗余的,因为它重复了已有的信息。但是派生数据对于获得良好的只读查询性能通常是至关重要的。它通常是非规范化的。可以从单个源头派生出多个不同的数据集,使你能从不同的“视角”洞察数据。
⼤多数据库,存储引擎和查询语言,本质上既不是记录系统也不是派生数据系统。数据库只是⼀个工具:如何使用它取决于你⾃己。记录系统和派生数据系统之间的区别不在于工具,而在于应⽤程序中的使⽤方式。

第10章 批处理系统

对于在线系统,⽆论是浏览器请求⻚面还是调⽤远程API的服务,我们通常认为请求是由人类用户触发的,并且正在等待响应。他们不应该等太久,所以我们非常关注系统的响应时间。
Web和越来越多的基于HTTP/REST的API使交互的请求/响应风格变得如此普遍,以至于很容易将其视为理所当然。但我们应该记住,这不是构建系统的唯⼀方式,其他⽅法也有其优点。我们来看看三种不同类型的系统:

  • 在线服务(在线系统)
    服务等待客户的请求或指令到达。每收到一个,服务会试图尽快处理它,并发回⼀个响应。响应时间通常是服务性能的主要衡量指标,可⽤性同样非常重要(如果客户端⽆法访问服务,用户可能会收到报错消息)。
  • 批处理系统(离线系统)
    一个批处理系统有⼤量的输入数据,跑一个作业来处理它,并生成一些输出数据,这往往需要一段时间(从⼏分钟到几天),所以通常不会有用户等待作业完成。相反,批量作业通常会定期运行(例如,每天一次)。批处理作业的主要性能衡量标准通常是吞吐量(处理特定⼤小的输⼊所需的时间)。
  • 流处理系统(准实时系统)
    流处理介于在线和离线之间,所以有时候被称为准实时或准在线处理理。像批处理系统一样,流处理消费输入并产⽣输出(并不需要响应请求)。但是,流式作业在事件发⽣后不久就会对事件进行操作,而批处理作业则需等待固定的一组输⼊数据。这种差异使流处理系统⽐起批处理系统具有更低的延迟。

MapReduce与分布式文件系统

MapReduce有点像Unix⼯具,但分布在数千台机器上。像Unix⼯具一样,它相当简单粗暴暴,但令⼈惊异地管⽤。⼀个MapReduce作业可以和⼀个Unix进程相类⽐:它接受⼀个或多个输⼊,并产生一个或多个输出。
和大多数Unix工具⼀样,运行MapReduce作业通常不会修改输入,除了生成输出外没有任何副作用。 输出文件以连续的方式⼀次性写入(在写⼊文件时,不会修改任何现有的文件部分)。
MapReduce作业在分布式⽂件系统上读写⽂件。在Hadoop的Map-Reduce实现中,该文件系统被称为HDFS(Hadoop分布式⽂件系统),一个 Google文件系统(GFS)的开源实现。
除HDFS外,还有各种其他分布式文件系统,如GlusterFS和Quantcast File System(QFS)。诸如Amazon S3,Azure Blob存储和OpenStack Swift等对象存储服务在很多⽅面都是相似的。
与网络连接存储(NAS)和存储区域⽹络(SAN)架构的共享磁盘⽅法相比,HDFS基于无共享原则。共享磁盘存储由集中式存储设备实现,通常使用定制硬件和专⽤网络基础设施(如光纤通道)。⽽另⼀⽅面,⽆共享⽅法不需要特殊的硬件,只需要通过传统数据中心⽹络连接的计算机。

MapReduce作业执行

MapReduce是⼀个编程框架,你可以使⽤它编写代码来处理HDFS等分布式⽂件系统中的⼤型数据集。MapReduce中的数据处理模式大致如下:

  1. 读取一组输⼊文件,并将其分解成记录。在Web服务器日志示例中,每条记录都是⽇志中的一⾏。
  2. 调用Mapper函数,从每条输⼊记录中提取一对键值。
  3. 按键排序所有的键值对。
  4. 调⽤Reducer函数遍历排序后的键值对。如果同⼀个键出现多次,排序使它们在列表中相邻,所以很容易组合这些值⽽不必在内存中保留很多状态。

这四个步骤可以作为⼀个MapReduce作业执行。步骤2和4是用户编写的⾃定义数据处理代码。步骤1由输入格式解析器处理。步骤3中的排序步骤隐含在MapReduce中——你不必编写它,因为Mapper的输出始终在送往Reducer之前进⾏排序。
要创建MapReduce作业,你需要实现两个回调函数,Mapper和Reducer,其行为如下:

  • Mapper
    Mapper会在每条输入记录上调⽤一次,其⼯作是从输⼊记录中提取键值。对于每个输⼊,它可以⽣成任意数量的键值对(包括空记录)。它不会保留从⼀个输入记录到下⼀个记录的任何状态,因此每个记录都是独⽴处理的。
  • Reducer
    MapReduce框架拉取由Mapper生成的键值对,收集属于同一个键的所有值,并在这组值列表上迭代调用Reducer。 Reducer可以产⽣输出记录(例如相同URL的出现次数)。

在MapReduce中,如果你需要第⼆个排序阶段,则可以通过编写第⼆个MapReduce作业并将第一个作业的输出用作第二个作业的输入来实现它。这样看来,Mapper的作⽤是将数据放⼊一个适合排序的表单中,Reducer的作用是处理已排序的数据。

MapReduce的分布式执行

下图显示了Hadoop MapReduce作业中的数据流。其并行化基于分区:作业的输入通常是HDFS中的一个目录,输⼊目录中的每个⽂件或文件块都被认为是一个单独的分区,可以单独处理map任务(图中的m1,m2和m3标记)。
在这里插入图片描述
每个输⼊文件的⼤小通常是数百兆字节。 MapReduce调度器试图在其中一台存储输⼊文件副本的机器上运行每个Mapper,只要该机器有足够的空闲内存和CPU资源来运行Mapper任务。这个原则被称为将计算放在数据附近:它节省了通过网络复制输⼊文件的开销,减少⽹络负载并增加局部性。
在⼤多数情况下,应该在Mapper任务中运行的应⽤代码在将要运行它的机器上还不存在,所以MapReduce框架⾸先将代码(例如Java程序中的JAR⽂件)复制到适当的机器。然后启动Map任务并开始读取输⼊文件,⼀次将一条记录传入Mapper回调函数。Mapper的输出由键值对组成。
计算的Reduce端也被分区。虽然Map任务的数量由输⼊文件块的数量决定ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值