type
status
date
slug
summary
tags
category
icon
password
分布式系统定义特点实现方式集群网格计算云计算集群集群的瓶颈和问题进程和线程的区别多进程多线程HadoopHDFS (Hadoop Distributed File System) 分布式文件系统特性架构工作流程HDFS的优势HDFS的局限MapReduceMap阶段Shuffle 阶段Reduce阶段工作流程优势局限YARN (Yet Another Resource Negotiator)核心组件示例:MapReduce作业YARN 的局限性Hadoop 的生态系统HiveSpark代码框架Spark核心概念RDD (Resilient Distributed Dataset)Transformation 和 Action优点Spark和Hadoop的区别HPCHPC和Hadoop的区别工作流程Slurm 资源和作业调度系统脚本示例提交作业MPI流程Python代码示例 (mpi4py)服务模型分类部署模型分类虚拟化技术虚拟机(VM)容器 (Container)Docker镜像(Image)和容器(Container)原理NamespacesCgroups(控制组)UnionFS(联合文件系统)Docker和Kubernetes (k8s)Docker ComposeAnsible
分布式系统
定义
多个电脑通过网络连接,协同工作完成一个任务
特点
- 资源共享:节点之间共享硬件,数据和资源
- 并行处理
- 容错性
实现方式
集群
- 定义:同构,本地网络,集中
- 特点:资源共享,负载均衡,高容错
- 示例:Hadoop,HPC
网格计算
- 定义:异构,分散
云计算
- 定义:通过互联网提供按需计算资源和服务,异构
- 特点:动态扩展,按量付费;虚拟化;IaaS, PaaS, SaaS
- 示例:AWS,Google, Clould Platform
集群
集群的瓶颈和问题
- 网络
- 节点故障
- 数据一致性:有效的同步和锁机制
- 负载均衡
- 安全性
进程和线程的区别
- 进程是占一个独立内存空间
- 线程是一个进程的子任务
多进程
多进程可以充分利用多核CPU的优势,实现真正的并行处理,如Web服务器、独立的计算任务等
多线程
适用于需要高效通信和共享资源的任务,如GUI应用、游戏开发等
Hadoop
用于处理大规模数据集的开源分布式计算框架
HDFS (Hadoop Distributed File System) 分布式文件系统
特性
- 分布式存储:将文件分成多个blocks,存在集群的不同节点上,通常为128MB或256MB
- 高容错:每个数据块都有副本再不同节点,方便数据恢复
- 高吞吐量:优化读写操作
- 流式数据访问:一次写入、多次读取
架构
- NameNode 主节点:HDFS的中心控制节点。负责元数据的协调和管理
- DataNode 数据节点:实际的数据储存和读取
工作流程
- 文件储存
- 一个文件写入HDFS,切块放到集群中的多个DataNode,NameNode记录数据块位置和副本信息
- 读取文件
- 客户端读取文件,NameNode提供数据块信息,DataNode交互数据
- 数据复制
- 每个数据块复制到多个 DataNode 上
HDFS的优势
- 扩展性
- 容错性
- 高吞吐量
HDFS的局限
- 小文件处理效率低
- 优化顺序写入,但是对随机写入的支持较差
- 更适合实时数据
MapReduce
由两个主要的计算阶段组成:Map 阶段和 Reduce 阶段。这两个阶段用于处理数据,并将其转换为有用的结果
Map阶段
处理输入数据,转成键值对
过程
- 输入数据被分成小块,分发给多个 Map 节点处理
- 每个节点对数据进行**映射(Map)**操作,输出为键值对(key-value pair)
示例
- 假设输入数据是一个包含文本文件的日志文件。Map 函数可以统计每个单词的出现次数,将每个单词映射为一个键值对(单词,1)
Shuffle 阶段
负责对 Map 任务的输出进行排序、分组、分发,为 Reduce 任务提供有序的输入
- Map 端输出
- key-value pairs不会立即发送给 Reduce 节点,而是先写入本地磁盘的缓冲区(buffer)
- Partition 分区
- 哈希函数对key-value pairs进行分区
- Sort 排序
- 按键进行排序
- Combine 预聚合
- 将相同键的值在本地进行初步的聚合
- Shuffle数据传输
- 通过网络将分区后的数据从 Map 节点 传输到对应的 Reduce 节点
Reduce阶段
将 Map 阶段生成的中间键值对进行汇总和处理,生成最终的结果
过程
- Map阶段的键值对被分组和排序,具有相同键的分到一起
- Reduce函数将每个键的所有值进行合并,并输出一个新的键值对
示例
- Reduce 函数将所有单词的出现次数汇总,生成每个单词的总出现次数
工作流程
- Split阶段:输入数据存在HDFS,分块,分发到各个计算节点
- Map阶段:读取,执行Map函数,转成键值对(Ip地址,次数n)
- Shuffle洗牌阶段
- Reduce任务:处理汇聚后的键值对,执行 Reduce 函数,将数据汇总成最终结果
- 输出结果:写入 HDFS 或其他存储系统中
Combine的作用
- 降低I/O:提供给MapReduce的缓存的容量是有限的,缓存中Map结果的数量会不断增加,很快就会占满整个缓存,需要把缓存中的内容一次性写入磁盘,并清空缓存。先进行初步合并可以减少需要写入磁盘的数据量
- 降低网络传输成本:Combine减少数据规模,也就减少网络传输的耗时
优势
- 扩展性
- 容错性
局限
- 性能瓶颈:分组和排序阶段
- 对于复杂操作,图计算机器学习可能不太高效
YARN (Yet Another Resource Negotiator)
资源管理和作业调度框架,负责管理集群的计算资源,并调度作业在集群上运行
旧版本 MapReduce 中的 JobTracker/TaskTracker 在可扩展性、内存消耗、可靠性和线程模型方面存在很多问题,需要开发者做很多调整来修复。
在 MR1 中,JobTracker 有两个功能,一个是资源管理,另一个是作业调用
核心组件
- ResourceManager(资源管理器):拥有调度决定权,调度资源进行分配
- NodeManager(节点管理器):负责节点的资源监控和管理
- ApplicationMaster(应用程序主控器):管理生命周期和资源需求,与 ResourceManager 交互
示例:MapReduce作业
- 提交作业:提交 MapReduce 作业到 YARN 集群
- 资源申请:ApplicationMaster 向 ResourceManager 请求资源,以启动任务
- 资源分配:ResourceManager 将资源分配给 ApplicationMaster,NodeManager 启动任务容器
- 任务执行:容器执行 MapReduce 任务,ApplicationMaster 监控任务状态
- 作业完成:作业完成后,资源被释放,ApplicationMaster 向 ResourceManager 报告作业状态
YARN 的局限性
- 复杂性
- 性能瓶颈
- 调度策略限制
Hadoop 的生态系统
Hive
数仓,提供SQL查询语言 (HiveSQL),用于在HDFS上执行数据查询和分析
Spark
集群计算系统,比 MapReduce 更快的内存计算能力,并支持多种数据处理任务,如批处理、实时处理、机器学习和图计算
代码框架
- Map和Reduce 函数
- 使用 Hadoop Streaming 运行作业
Spark
是 Hadoop MapReduce 的一种改进。Spark 提供了一个统一的分析引擎,可以支持 SQL 查询、流处理、机器学习和图计算等多种大数据处理任务
核心概念
RDD (Resilient Distributed Dataset)
它是一个分布式的、只读的、不可变的数据集合。RDD 的设计旨在提供高效的并行计算,支持在大规模数据集上进行复杂的数据处理任务
核心特性
- 弹性(Resilient):能够在节点失败时自动恢复
- 分布式(Distributed):
- RDD 被分布在集群中的多个节点上,支持并行计算。
- 每个 RDD 被分成多个分区(partition),这些分区分布在不同的节点上并行处理
- 不可变(Immutable):只读数据:RDD 是不可变的,即一旦创建就不能修改。对 RDD 的任何操作都会生成新的 RDD。
Transformation 和 Action
- Transformation:转换操作,如 map、filter,它们是懒执行的,只有在触发 Action 时才会实际计算
- Action:行动操作,如 count、collect,它们会触发实际的计算
优点
- 基于内存运算,处理速度快
- 提供更高级的API
- 容错性(RDD)
- 与 Hadoop HDFS、YARN都有兼容
Spark和Hadoop的区别
- 场景不同
Hadoop是一个分布式数据储存框架
Spark是提供这种储存方式的数据处理工具
- 处理速度不同
MapReduce:磁盘读取,处理,写入磁盘,速度会有影响
Spark:磁盘读取,中间数据放入内存,完成必要的分析处理,再写回集群
- 容错性不同
Hadoop:依赖于数据副本(HDFS)的持久化和任务重试来实现容错,恢复速度慢
Spark:RDD的特性,能够更快速地恢复丢失的数据
HPC
HPC和Hadoop的区别
- 高性能计算适用于计算密集型的作业,如果节点需要访问的数据量很庞大,就会遇到网络带宽的瓶颈
- Hadoop尽量在节点上存储数据,就能实现本地快速访问,也就是数据本地化。
工作流程
1. 任务划分(Task Partitioning):将计算任务划分为多个子任务,以便并行执行。
2. 任务分配(Task Assignment):分配给节点 (Slurm)
3. 并行计算(Parallel Computation):MPI
4. 数据交换(Data Exchange):计算节点之间交换中间结果和数据。
5. 结果汇总(Result Aggregation)
6. 结果输出(Output Results):使用存储系统(如并行文件系统)存储结果
Slurm 资源和作业调度系统
脚本示例
提交作业
MPI
流程
- 初始化MPI环境:
- comm = MPI.COMM_WORLD:获取全局通信器
- rank = comm.Get_rank():获取当前进程的 rank
- size = comm.Get_size():获取总进程数
- 读数据
- 数据分块并分配给每个进程
- 每个进程进行任务
- 结果收集到根进程
Python代码示例 (mpi4py)
服务模型分类
IaaS(Infrastructure as a Service)
- IaaS 提供基础的计算资源,如虚拟机、存储、网络等
- 用户可以运行操作系统和应用程序
- 具有高度的灵活性和控制权,适合需要定制化硬件和软件环境的用户
- Google Cloud Platform的Compute Engine
PaaS(Platform as a Service)
- PaaS 提供开发和部署应用程序的平台
- 用户可以专注于应用程序的开发和管理
- Google Cloud Platform 的 App Engine
SaaS(Software as a Service)
- 提供通过互联网访问的软件应用程序
- 用户不需要管理底层的基础设施和平台,只需使用服务商提供的应用程序
- Microsoft Office 365
部署模型分类
公有云
私有云
混合云
虚拟化技术
虚拟化技术是一种通过软件创建虚拟版本的计算资源(如操作系统、服务器、存储设备或网络资源)的技术。这些虚拟版本可以在同一台物理硬件上运行,允许多个虚拟系统共享物理资源,从而提高资源利用率和灵活性
虚拟机(VM)
- 架构:在物理硬件上虚拟出完整的虚拟计算环境
- 资源开销高,启动时间长,隔离性高
- 应用场景:适合多租户环境、需要不同操作系统的应用、传统企业应用部署。
容器 (Container)
- 架构:容器共享宿主操作系统 (物理计算机上运行的基础操作系统) 的内核,只包含运行应用所需的依赖。
- 资源开销低,启动时间短,隔离性低
- 应用场景:适合微服务架构、现代应用开发、DevOps 环境。
Docker
一种开源的容器化平台
镜像(Image)和容器(Container)
- 镜像(Image):
- 镜像是一个只读的模板,它包含了文件系统内容、配置参数。静态不可变
- 容器(Container):
- 容器是镜像的运行实例,其中包含了运行应用程序所需的所有内容
- 容器可以被启动、停止、删除、暂停等操作
原理
Namespaces
- 使用 Linux 的 Namespaces 技术来实现资源的隔离
- 进程 ID,自己的虚拟网卡、IP 地址和路由表
Cgroups(控制组)
- 使用 cgroups 来限制和管理容器的资源使用,例如 CPU、内存、磁盘 I/O 等
UnionFS(联合文件系统)
- 实现镜像的分层存储
Docker和Kubernetes (k8s)
Docker用于容器的构建和运行,而Kubernetes用于容器集群的管理和编排
Docker Compose
- 运行多个Docker容器应用程序的工具,使用一个单独的YAML文件来配置应用程序
- 使用一个命令就可以一次性启动、停止和管理整个应用程序的容器集合。
举例
在这个例子中,我们定义了三个服务:web、api和db。web服务使用Nginx镜像,api服务使用自定义的应用程序镜像,而db服务使用MySQL镜像。api服务依赖于db服务,在启动api服务之前,需要先启动db服务。我们还定义了端口映射,将主机的80端口映射到web服务的容器端口80上。
通过这个Docker Compose文件,您可以使用
docker-compose up
命令一次性启动所有服务,或者使用docker-compose down
命令停止并删除所有相关的容器。这使得管理和运行多个相关的容器应用程序变得更加简单和方便。Ansible
- 作者:Boomshakalaka
- 链接:https://www.cjyblog.icu/article/bigdata-cloudcomputing
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。