一、分布式设计基础

传统架构问题

① 单机资源不足

  • 存储: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的节点