1. Focused Infrustructures
- Storage
- Computation
- Communication(6.829)
2. Main Topics
- Fault tolerace
- avaliability
continue to deliver service enven there exists some fault -> replication - recoverability
bring it back when it rebuild -> logging/transactions
- avaliability
- Consistency
multi-systems word as a single system, i.e sequencial system - Performance
to get a balance- throughput
increase by machides numbers - latency / tail latency
one small machine delay all request -> tail latency
- throughput
- Implementation
3. Thsis - Map Reduce
Abstract and Introduction
MapReduce是一个用于处理大型数据集的编程模型。用户通过指定一个map函数,将原始数据处理成Key-Value形式的中间形式,以及一个reduce函数,处理这些中间键值对得到最终结果。许多现实世界的任务都可以通过这个模型表示。
MapReduce是为了实现一个运行在集群上的自动并行处理系统。运行时,该系统自动完成对数据的切分、任务的派发、worker间的通信和机器运行错误。
MapReduce隐藏了并行化(parallelization)、容错(fault-tolerance)、数据派发(data-distribution)和负载平衡(load balancing)的细节,简化任务算法的实现。
输入和输出在gfs系统,中间在本地文件系统。
Programming Model
Type
map | (k1, v1) | list(k2, v2) |
reduce | (k2, list(v2)) | list(v2) |
Example
- WordCount
map函数将输入拆分为若干个<word, 1>,reduce函数接受这些对,输出<word, cnt> - Distributed Grep
map函数将输入进行模式匹配,输出匹配上的行,reduce函数直接复制到文件中 - Count of URL Access Frequency
map函数输出<URL, 1>,reduce函数进行整合<URL, cnt> - Reverse Web-Link Graph
map函数输出<target, source>,target是网页的URL,source是网页名称,reduce函数输出<target, list(source)> - Term-Vector per Host
每一个tern-vector都是词语在文件中出现的频率<word, frequence>,map函数得到<host, term-vector>,reduce得到<host, list(term-vector)> - Inverted Index
map函数翻译每个文件,并输出<word, document ID>,reduce函数输出<word, list(document ID)> - Distributed Sort
map函数根据输入,输出<key, record>,reduce直接复制
Implementation
Overview
- 用户程序中的MapReduce库将输入拆分成M个片段,每个片段大小在16MB-64MB,然后启动集群内若干机器的程序副本
- 所有启动的程序副本中,有一个机器担任master的角色,它负责通过调度算法,分配M个map任务和R个reduce任务给其他机器
- 处理map任务的机器从输入中抽取负责的第m个片段,然后使用用户定义的map函数得到中间KV对,存储在本地内存缓冲中
- 这些在本地内存缓冲中的KV对被周期性地写入到本地磁盘中,并向mater发送存储位置
- master将中间KV经过分区函数partional function进行shuffle后,将对应分区的中间KV地址交给reduce机器处理,reduce首先对这些文件使用RPC进行远程读取,然后对key进行排序,最后对同key的value进行合并
- 处理reduce的机器遍历完中间KV后,把处理好的key和value列表传递给用户定义的reduce函数,得到最后输出存入本地磁盘,并写入总文件系统
- 当所有的map和reduce任务完成后,master返回到用户程序
Master Data Structures
Worker-State
对每个执行map或reduce的机器,需要记录其状态(空闲、忙碌、完成)和标识符
File-Address-and-Size
对每个map产生的中间KV,要存储R个副本,master需记录这些副本的位置和大小,并将这些计算好的中间KV,增量地推送给reduce
Fault Tolerance
Worker Failure
- master定时ping节点,没有回应认为失败,进行任务地重新调度
- 已完成地map也需要重新调度,因为中间KV存储在map机器上,一旦失败就无法读取
- map失败会同步所有reduce,以便重定向中间KV地址
Master Failure
- 可以通过写日志进行回滚
- 但是因为只有一个master,故障可能性低,所以直接abort
Semantics in Presense of Failures
一般要求map\reduce是确定的,这样就能保证重试的结果同串行相同。如果不能保证确定,容错的语义就很弱
Locality
网络带宽会很大程度影响整体性能,现只有map到reduce中间会有通信,其他都在本地完成。出错时也优先选择同交换机内的节点进行重试,以减少网络带宽造成的影响
Task Granularity
master需要做O(M+R)的调度决策,并且记录O(M*R)个状态信息。
所以一般要求M和R要远远大于机器数量,由于R受用户影响,所以一般来说M会是一个大倍数,R是一个小倍数
Backup Task
整体框架的速度受starggler的影响,它被定义为由于各种原因导致处理速度变慢的机器。
master在所有任务即将完成的时候,会记录仍在运行中的任务,并将这些任务调度给其他机器执行,优先接受先完成的结果。
Refinements
提供了很多可扩展的参数以进行优化
Partitioning Function
分区函数影响最终输出的文件内容,因为一个reduce只生成一个磁盘文件。一般来说,将中间KV进行分区的函数使用一个哈希映射(hash(key) mod R)来完成分区,但是用户也可以根据任务的特殊性自定义。如对于URL的分析,一般来说希望将同一host的url存储在同一文件中,那么就可以定义分区函数为hash(hostname(URLKey)) mod R,这样就能让同一hostname的url在同一分区中,被同一reduce处理,存储在同一磁盘文件中
Ordering Guarantees
同一分区内的数据都是根据key进行升序排列的,这可以提高后续输出读取的速度
Combiner Function
通常来说,中间KV可能是重复的,比如词语计数中的<the, “1”>,使用一个combiner函数,在处理map的机器上,先组合一遍再向master报告完成,这样能减少对网络带宽的依赖。一般来说合并函数combiner functon和reduce function是一样的代码,只是其运行的位置不同————一个在map worker上运行、一个再reduce worker上运行
Input and Output Types
标准库提供了多种类型,比如text类型和有序KV列表类型。每个类型都知道该如何将自己平均且正确的切片,比如text类型就只会在行结尾标志进行拆分,而不会拆行。用户可以自定义一个reader接口来自定义KV类型,这个接口不一定从文件读数据,也可以从数据库读
Side-effects
对于某些特定问题,可能通过map/reduce函数生成中间文件会很方便,标准库要求程序员能保证任务具有跨文件一致性,以确保操作的原子化和幂等化。
Skipping Bad Records
有些数据会导致程序陷入漏洞,标准库提供一个可选择的执行模式以记录并跳过这些数据。每个工作机器在执行任务前都会安装一个信号处理程序通过记录序列号来捕获分割冲突和总线错误,一旦发生错误,机器向master发送一个“last gasp”UDP包,master记录下坏数据以跳过
Local Execution
由于底层是分布式系统,所以调试map/reduce会很艰难。标准库提供一种模式,进行单机模拟,来调试、分析和小规模测试
Status Information
master会运行一个http服务器用以展示集群状态。
Counters
可以为map/reduce函数提供一个计数器对象的参数用以计数。计数器的综合将有master进行处理,master会进行去重(由于容错和备份机制的存在,可能会出现重复的数据副本)
4. Fault Tolerance
cordinator reruns map/reduce function
- map function can run twice
because maybe there exitst nont crush but network latency, the cordinator may mistake it as a cruch. But it doesn’t matter 'cause same input processed by same functoin will get a same answer. - reduce function can run twice
- cordinator cannot fail
- slow worder -> stragger
take their work as back up task, assign the same task for other workers to do it again