一、分布式设计基础
传统架构问题
① 单机资源不足
- 存储:3台机器,每台机器都有2T的硬盘空间,但是现在有1个3T的文件要存储
- 计算:3台机器,每台机器都有8核CPU和8GB内存,但是现在有1个程序需要12核CPU和24GB内存
② 单机性能较差
- 存储:10个1GB大小的文件,共10GB,要存储写入一台机器,1台机器的磁盘最多500MB/s,需要20s以上
- 计算:10个程序需要运行,每个程序需要8核8GB资源,1台机器有10核10GB,只能挨个运行
分布式思想
核心:分而治之
- 分:将一个大的任务拆分成多个小的任务,每台机器处理一个小的任务,并行处理
- 合:将多个小任务的结果最终再合并生成最终的结果进行返回
用于解决传统架构问题
- 存储:将3T的文件拆分成若干个小文件,例如每500M一个小文件,将这些小文件存储在不同的机器上
- 计算:将这个程序拆分成若干个小程序,每个小程序只需要3核6G,将这些小程序运行在不同的机器上
分布式软件架构
分布式:一般由多个提供相同或者不同服务的机器共同协作,称为分布式系统或者分布式服务,强调合作关系
普通分布式主从架构
- 主节点:管理节点:管理所有的从节点,管理所有任务的分配,对外接受用户的请求
- 从节点:工作节点:一般一个从节点负责一台机器,利用一台机器的资源来完成主节点分配的小任务
举例:
HDFS:从逻辑上将多台机器的磁盘合并为一个整体
- NameNode(主节点):管理节点:管理从节点,管理元数据,接客
- DataNode(从节点):存储节点:负责实现NameNode分配的任务的数据块的存储
YARN:从逻辑上将多台机器的内存和CPU合并为一个整体
- ResourceManager(主节点):管理节点,负责资源管理和任务调度,接客
- NodeManager(从节点):计算节点,负责利用自己节点的CPU和内存来完成RM分配的运行计算的任务
二、分布式计算设计
分布式计算本质
- 将一个大的计算任务拆分成多个小的计算任务,由多台机器并行执行所有小任务
- 最终将每个小任务的结果进行合并得到最终结果
组成:分布式程序+分布式资源
分布式程序:一个多进程的程序,程序运行时可以拆分成多个进程来运行【MapReduce:提供一套API】
分布式资源:一个多机器的集群,可以将多台机器的硬件资源从逻辑上合并为一个整体【YARN:分布式资源】
目标:处理数据
处理流程
① 读取数据:Input
- 读取数据,按照一定的规则将数据划分成多份,一般称为数据分片或者数据分区
- MR规则:按照数据文件是否大于128M的1.1倍来拆分
- 大于:按照128M来分
- 小于:整体作为一个分片
- 举个栗子
- file1:140M => Block1-128M,Block2-12M => Split1
- file2:145M => Block1-128M, Block2-17M => Split1-Block1, Split2-Block2
- 将每个分区的数据读取机器的内存中,不同分区的数据放在不同的机器内存中
② 处理数据:Process
- 根据划分规则,每个分区的数据对应一个Task计算任务来计算
- MR规则:每个分片就启动一个MapTask来进行处理
- 三个部分:Map、Shuffle、Reduce
- 每个Task计算任务可以运行在不同的机器上,使用多台机器的资源并行执行
③ 保存结果:Output
- 最后使用Task将前面每个Task任务计算的结果进行合并,输出保存
举例说明
需求:计算指定范围内的求和,假如数据量非常大。这里拿1~9举例
step1-Input:将1 ~ 9 的9个数字划分为三份【具体根据划分规则来决定】
- split1:1 2 3:数据在Node1上
- split2:4 5 6:数据在Node2上
- split3:7 8 9:数据在Node3上
step2-Process:启动多个Task分别对每个Split进行求和
- Task1:处理Split1:1 + 2 + 3 = 6:Node1
- Task2:处理Split2:4 + 5 + 6 = 15:Node2
- Task3:处理Split3:7 + 8 + 9 = 24:Node3
step3:将上面每个Task的结果进行合并
- Task4:将Task1 ~ Task3的结果进行合并:6 + 15 + 24 = 45
- 输出结果
以Hadoop为例,概念对比
- MapReduce程序有两种
- 三个阶段:Input、Map、Output【part-m-00000】
- 五个阶段:Input、Map【分】、Shuffle【分组】、Reduce【合】、Output【part-r-00000】
栗子 | Hadoop |
---|---|
1 ~ 9 | 理解为HDFS中的一个文件 |
Split1,Split2,Split3 | 理解为这个文件被分成了三个Block块 |
Task1,Task2,Task3 | 理解为三个Map Task进程,分别运行在三台NodeManager上 |
Task4 | 理解为一个Reduce Task进程,将三个MapTask的结果做最终聚合 |
Node1,Node2,Node3 | 作为DataNode和NodeManager的节点 |