并行计算与分布式计算技术基础
并行计算的背景
提高计算机性能的技术手段
- 提高处理字长
- 提高集成度
- 优化微体系结构
- 提高处理器频率
所有的这些技术极大的提高了单核微处理器的计算性能,但2004年后处理器的性能不在像人们预期的那样提高。
单核处理器想能提升接近极限!
- VLSI集成度不可能无限制提高
- 处理器的指令集并行度提升接近极限(ILP墙)
- 处理器速度和存储器速度差异越来越大(存储墙)
- 功耗和散热大幅增加超过芯片的承受能力(功耗墙)
从串行到并行——发展的必然趋势(技术发展)
- 多核/众核并行计算
- 大数据时代,爆炸性增长的Web规模数据量
- 超大的计算量/计算复杂度
并行计算——概念
并行计算
- 多CPU处理
- 一个问题被分解为并发处理的不同部分
- 每一部分由多条指令处理
- 每一部分的指令在不同的CPU上同时运行
并发和并行
- 并发: 多线程轮流交替处理
- 并行: 多线程同时独立运行
并行计算——分类
按数据和指令处理结构:FLynn分类
- SISD (单指令单数据流):传统的单处理器串行处理
- SIMD(单指令多数据流):向量机,信号处理系统
- MISD(多指令单数据流):很少使用
- MIMD(多指令多数据流):最常用,TOP500
按并行架构分类
- 位级并行
- 指令集并行
- 线程级并行
- 数据级并行
- 任务级并行
按存储访问结构分类
单地址空间共享内存
- (Uniform Memory Access):所有处理器均匀共享物理存储器,所有存储器访问任何存储字需要相同的时间,对应的并行机系统称为Symmetrical Multi-Processing
- (Non-Uniform Memory Access):处理器访问内存的时间不同,对应的并行机系统称为Distributed Shared Memory
多地址空间非共享内存:所有处理器的存储器是私有的,各处理器通过消息传递方式通信,对应的并行机系统称为Massive Parallel Computing
按计算特征分类
- 数据密集型:大量Web信息搜索
- 计算密集型 : 3-D建模与渲染,气象预报
- 数据密集与计算密集混合型:3-D电影渲染
按并行程序设计模型/方法分类
- 共享内存变量
- 消息传递方式
- MapReduce方式
并行计算发展史
多对称处理器系统(Symmetrical Multi- Processing): 多个相同类型的处理器通过总线连接并共享存储器
特点:
- 对称共享存储
- 局部高速缓存
- 单一OS映像
- 低通信延迟
- 共享存储带宽
- 支持消息传递和支持共享存储并行程序设计
缺点:
- 可靠性低
- 可拓展性差(内存访问瓶颈)
分布式共享存储处理机系统(Distributed Shared Memory):多个相同类型的节点通过高速互联网连接并共享存储器
特点:
- 以节点为单位
- 物理上分布存储,逻辑上是共享存储的
- 单一内存地址空间
- NUMA模式
- 单一的OS映像
- 高通信带宽低延迟
- 可拓展性好
- 支持消息传递和支持共享存储并行程序设计(编程难度低)
大规模并行处理(Massive Parallel Processing):专用内联网连接一组处理节点形成计算系统
- 以节点为单位
- 每个节点具有不同的操作系统映像
- 节点上的内存模块相互独立
- 无全局内存单一统一的硬件编址
- 支持消息传递(编程难度高)
- 可拓展性高
集群(Cluster):网络连接的一组商品计算机构成的计算系统
- 高性价比
- 高可管理性
- 高鲁棒性
- 高可拓展性
- 软件支持丰富
网格(grid):集成的计算与资源环境(计算资源池)
- 互不信任的节点
- 异构的节点
- 天生分布式特点
- 计算公共设施
- 适合传输数据量小,但是计算量庞大、对实时性没有要求,对可靠性要求不高且无需交互
不同系统特征对比
- SMP:独立处理器和共享内存,以总线结构互联,运行一个操作系统,定制成本高,难以扩充,规模小
- MPP:独立处理器和独立内存、OS,专用的高速内联网络,难以升级和扩充,规模中等
- Cluster:商品化的刀片或机架服务器,以互联网为一个物理上紧密的计算系统,可拓展性强,规模可小可大,是目前高性能并行计算中最常用的形式
- Grid:地理上广泛分布的异构计算机资源构成的一个极为松散的计算系统,主要用于并行度很低的大规模科学计算任务
并行计算的主要技术问题
- 并行计算任务分解和算法设计
- 数据同步访问和通信控制
- 可靠性设计和容错技术
- 并行计算软件框架平台
- 系统性能评价和程序并行度评估
Amdahl定律:
程序能得到多大的并行加速依赖于该程序有多少可并行计算的比例。
根据Amdahl定律:一个并行程序可加速程度是有限制的,并非无限加速,并非处理器越多越好
分布式计算和并行计算的区别
并行计算与分布式计算都是运用并行来获得更高的性能或者求解大规模的问题。简答来说,如果处理单元共享内存,就称为并行计算,反之就是分布式计算。
Sacle-up && Scale-out
- 硬件扩展:增加更多设备;增加更快更大设备;
- 硬件限制:不受设备限制;受设备限制;
- 灵活性:更多;更少;
- 存储管理负责度:可视化软件管理;很少需要管理;
- 跨地域拓展:是;否
分布式计算——优点和特点
- 资源共享:可共享系统中的硬件、软件和数据等信息资源
- 分布式透明处理平台:展现给用户的是一个同意的整体平台;
- 高性价比:分布式系统具有较高的性价比
- 应用分布:多数应用(银行、铁路购票)本身就是分布式的,如ATM;
- 高可靠性:
- 可拓展性:添加几台PC等可提高系统的性能;
- 高灵活性:能够兼容不同硬件厂商的产品,兼容低配置机器和外设而获得高性能计算;
分布式计算——系统架构
C/S架构
服务器有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。也可看做为胖客户端架构,客户端需要实现绝大多数的业务逻辑和界面展示。
优点:
- 界面和操作可以很丰富
- 安全性能可以很容易保证,实现多层认证也不难
- 只有一层交互交互,响应速度比较快
缺点:
- 适用面比较窄,通常用于局域网中
- 用户群固定
- 维护成本高,发生一次升级,则所有客户端的程序都要改变
B/S架构
Browser客户端,WebApp服务器端和DB端构成三层架构。显示逻辑交给Web浏览器,实物处理逻辑放在了WebApp上,这样就避免了庞大的客户端,减少了客户端的压力,瘦客户端
优点:
- 客户端无需安装,有Web浏览器即可
- 交互性强
- 无需升级多个客户端,升级服务器即可
缺点:
- 跨浏览器,BS架构不尽如人意
- BS架构的表现要达到CS架构需要花费不少精力
- 在高速和安全性上需要花费巨大的设计成本
- 客户端和服务器端的交互式请求-相应模式,通常需要刷新页面
P2P
对等网络,多个客户端不经过服务器而直接通信的架构,每个节点既是客户端,又可以作为服务器给其他节点提供资源和服务。
- 完整连接拓扑结构:每个客户端和其他客户单之间必须有连接,信息可以在用户间之间交换
- 环状拓扑架构,指的是信息只有流进一个或多个客户端后才能传递过来的架构。
云计算
初识云计算
在分布式计算中,起初人们更加关心服务器端和客户端,网络部分对用户是透明的,因此,“云”作为一种抽象表示互联网。
随着互联网的发展,网络的作用除了接入、路由,还包括计算、存储、服务等元素,云变得充实、具体化、复杂。
云计算技术的来源
硬件需求
- 变买为租
- 能力弹性
- 可靠性保证
- 管理维护
开发者需求
- 变买为租
- 配置管理
- 培训
- 快速应对应用使用者的个性化新应用需求
应用需求
- 更多的应用选择
- 更发辫的应用获取渠道
- 参考信息
云计算的层次分类
- 基础设施云(Infrastructure as a Service)
- 平台云(Platform as a Service)
- 应用云(Software as a Service)
谷歌的大数据之路
- Scalability : add more machines, without modify the current system
- Reliability : one single machine’s failure, don’t break down the entire system.
- Elasticity : use the same machines, for different business, at different time
- Security : prevent data leak
分布式文件系统(DFS)
数据划分
以块为单位进行数据的存储和读写管理,选择大的block size,最小化寻址开销,使得磁盘传输数据的时间可以明显大于定位这个快所需要的时间
优点:
- 可存储文件的大小不受限于任何一台计算机的物理存储能力上线
- 以块为存储单位,极大简化了存储子系统的设计,可以有效的分离元数据与数据本身
- 非常适合为数据容错能力和可用性提供支持
元数据
反映的是分布式文件系统的全局映像,一般集中在一个主控节点中进行维护
- 文件和目录自身的属性信息,如文件名,目录名,文件大小
- 记录文件内容存储相关信息,如文件分块情况,副本个数
- 记录分布式文件系统中所有数据存储节点的信息,用于数据存储节点的管理
数据分布与负载均衡
分布式文件系统与传统单机系统的重要区别在于,其能将数据分布到多个存储节点上,并在多个节点中实现负载均衡
一致性哈希
将节点和数据映射到同一线性地址空间,节点负责保存前一节点到本节点之间的数据
- 环形Hash空间
- 把数据和节点都映射到环上
- 删除/添加节点,按照顺时针将数据迁移
- 虚拟节点平衡负载
总控节点
- 为新上线的节点分配负载
- 将高负载的节点数据迁移到其他节点
工作节点
通过心跳机制定时发送,将节点的负载情况(CPU、内存、磁盘、网络等)发送给主控节点
可用性
副本
针对一份数据的多份冗余拷贝
副本放置策略
机架敏感策略:
- 第一个block副本放在client所在的node里
- 第二个副本放在与第一个节点不同的机架的node里
- 第三个副本放在和第二个在同一个机架,随机放在不同的node中
节点之间的距离:
- d = 0,相同的DataNode
- d = 2,同一机架的不同DataNode
- d = 4,同一数据中心的不同机架
- d = 6,不同数据中心的DataNode
一致性
基于主副本的流水复制协议
写请求发给主副本,主副本发送同步给备副本,各副本通知同步成功之后,主副本才返回客户端写成功
容错
租约协议:带有超时时间的一种授权,能非常好的容错网络异常,确定节点状态
机器A可以给机器B发放租约,机器B持有的租约在有效期内才允许提供服务,否则主动停止服务。机器B的租约快要到期的时候想机器A重新申请租约
GFS的工作原理
设计原则
- 廉价本地磁盘分布存储
- 多数据自动备份解决可靠性
- 为上层MapReduce计算框架提供支撑
基本架构和工作原理
ChunkServer
保存实际数据的数据服务器
Master
保存了GFS文件系统的三种元数据
- 命名空间,即整个分布式文件系统的目录结构
- Chunk与文件名的映射表
- Chunk副本的文职信息
数据访问过程
- 客户端告诉Master要访问的文件名或者数据块的索引
- Master根据文件名或数据块索引在文件目录空间中查找和定位改文件或者数据块,定位到ChunkServer的位置信息,并将这些信息返回客户端
- 客户端直接访问ChunkServer
- 读取数据
特点:
- 数据流不许流经Master,避免了Master的访问瓶颈
- 并发访问,一个大的数据分块存储在不同的ChunkServer中,应用程序可实现并发访问
MapReduce
设计思想——分而治之
map:
reduce:
词频统计:
Class Mapper
method map(String input_key, String input_value):
//input_key: text document name
//input_value: document contents
for ench word w in input_value:
EmitIntermediate(w, "1");
Class Reducer
method reduce(String output_key, Iterator intermediate_values):
//output_key: a word
//output_values: a list of counts
int result = 0;
for each v in intermediate_values:
result += ParseInt(v);
Emit(AsString(result));
流数据
流数据的特点
- 数据快速持续到达,潜在大小也许是无穷无尽的
- 数据来源众多,格式复杂
- 数据量大,但是并不十分关注存储,一旦经过处理,要么被丢弃,要么被归档存储
- 注重数据的整体价值,不过分关注个别数据
- 数据顺序颠倒,或者不完整
批处理和实时计算
- 批量计算以静态数据为对象,处理时间充裕
- 流数据必须采用实时计算,一般要求响应时间为秒级
实时性对流数据处理的重要性
数据的价值随着时间的流逝而降低,为了及时处理流数据,就必须一个低延迟、可拓展、高可靠的处理引擎
流数据的应用场景
- 互联网提供个性化服务,亚秒级响应
- 物联网实时数据智能分析快速决策,毫秒级响应
滑动窗口技术
Strom的设计思想
- Streams:消息流stream是storm里的关键抽象。一个消息流是一个没有边界的tuple序列, 而这些tuple序列会以一种分布式的方式并行地创建和处理。通过对stream中tuple序列中每个字段命名来定义stream。在默认的情况下,tuple的字段类型可以是:integer,long,short, byte,string,double,float,boolean和byte array。你也可以自定义类型(只要实现相应的序列化器)。Storm提供的最基本的处理stream的原语是spout和bolt。你可以实现spout和bolt提供的接口来处理你的业务逻辑。
- Spout:消息源spout是Storm里面一个topology里面的消息生产者。一般来说消息源会从一个外部源读取数据并且向topology里面发出消息:tuple。
- Bolts:所有的消息处理逻辑被封装在bolts里面。Bolts可以做很多事情:过滤,聚合,查询数据库等等。
Bolts可以简单的做消息流的传递。复杂的消息流处理往往需要很多步骤,从而也就需要经过很多bolts。 - Topology:一个topology是spouts和bolts组成的图, 通过stream groupings将图中的spouts和bolts连接起来
- Stream Groupings:定义一个topology的其中一步是定义每个bolt接收什么样的流作为输入。stream grouping就是用来定义一个stream应该如果分配数据给bolts上面的多个tasks。
grouping方式
- Shuffle Grouping:随机分组,随机分发Tuple
- Fields Grouping:按字段分组,具有相同值的Tuple会被分发到对应的Bolt
- All Grouping:广播分发,每个Tuple都会被分发到所有的Bolt中
- Global Grouping:全局分组,Tuple只会分发到一个Bolt
- Direct Grouping:直接分组,由Tuple的生产者来定义接受者
Strom的架构
-Master节点:运行Nimbus的后台程序,负责在集群范围内分发代码,为Worker分配任务和检测故障
- Worker节点:运行Supervisor的后台程序,负责监听分配给他所在机器的工作
- zookeeper:Nimbus和Supervisor之间的所有协调工作都是通过Zookeeper集群完成。另外,Nimbus进程和Supervisor进程都是快速失败(fail-fast)和无状态的。所有的状态要么在zookeeper里面, 要么在本地磁盘上。这也就意味着你可以用kill -9来杀死Nimbus和Supervisor进程, 然后再重启它们,就好像什么都没有发生过。这个设计使得Storm异常的稳定。
Storm实例:wordcount
图数据
欧拉图
- 凡是由偶点组成的连通图,一定可以一笔画
- 凡是只有两个奇点的连通图,一定可以一笔画
- 其他情况都不能一笔画
图并行处理
- Vertex-centrix view of graphs
- Parallelism:partitioning graph (dependent)data across processing resources, and resloving dependencies(along edges)throuth iterative computation and communication.
PageRank
对于任意的网页
Pi
,它的PageRank可表示为:
其中 B 为网页
Pregel
Think like a vertex
NoSQL
NoSQL is movement,not only SQL
分类
- 键值数据库
- 列族数据库
- 文档数据库
- 图形数据库
理论支持
- 最终一致性
- CAP
- BASE
CAP
- 一致性(Consistency)
- 高可用性(Availability)
- 分区容忍性(Tolerance of network Partition)
PACELC
BASE
- Basically Available:基本可用,容忍分区失败
- Soft state:软状态,状态可以有一段时间不同步,异步
- Eventually consistent:最终一致
Paxos协议
- 信息传递
- 共享内存