作者:易秀胜_444 | 来源:互联网 | 2023-07-25 01:25
(一)并行计算的简介并行计算: 简单来讲,并行计算就是同时使用多个计算资源来解决一个计算问题,具有以下特点:一个问题被分解成为一系列可以并发执行的离散部分;每个部分可以进一步被分解
(一)并行计算的简介并行计算: 简单来讲,并行计算就是同时使用多个计算资源来解决一个计算问题,具有以下特点:
一个问题被分解成为一系列可以并发执行的离散部分;
每个部分可以进一步被分解成为一系列离散指令;
来自每个部分的指令可以在不同的处理器上被同时执行;
需要一个总体的控制/协作机制来负责对不同部分的执行情况进行调度。
并行计算示意图
这里的计算资源可以是分布式的计算机,也可以是多核CPU或多处理器的计算机。而计算的问题需要可以分解成可并发执行的的离散片段,并且不同离散片段可以在任意时间被执行。因此对于并行计算需要关心两方面的内容:计算资源的并行组织与.并行程序的设计。
(二)计算资源的并行组织1.分布式架构的结构
以分布式集群为例,并行计算任务中,最常用的是主从架构方案,具体根据功能的不同抽象为两种角色:
一类负责整体的资源调度,存储地址的管理等,不执行具体的任务,称为集群的主节点;另一类则只负责分配到的任务的具体执行和数据的实际存储,称为从节点。主从节点各司其职,配合完成并行计算任务。下面介绍主从节点的具体配置。
2.分布式架构的配置
(1)网络互通、SSH免密登录
对于分布式集群来说,首先要保证不同计算单元可以相互通信,可以是物理的连接也可以是通过网络的连接。配置网络保证ping通,并且为了后期访问的方便,安装SSH服务,相互传递公钥,保证可以相互免密码登录。
(2)配置JDK、Scala
Hadoop,Spark是运行在JAVA虚拟机上面的,所以要对所有的节点配置JDK环境,Spark为Scala语言原生编写,并且Scala的函数式编程更合适进行并行计算,所以安装Scala。
(3)配置Hadoop
hadoop架构图
分布式计算必然涉及分布式储存的问题,Hadoop的HDFS分布式文件系统,Hbase分布式数据库,Hive分布式数据仓库等组件是一个比较好的解决方案。安装配置Hadoop。
HDFS分布式文件系统和MapReduce计算框架为Hadoop的两个个核心设计。
HDFS的架构图如下,采用主从架构(master/slave)。一个典型的HDFS集群包含一个NameNode节点和多个DataNode节点。NameNode节点负责整个HDFS文件系统中的文件的元数据保管和管理,集群中通常只有一台机器上运行NameNode实例,DataNode节点保存文件中的数据,集群中的机器分别运行一个DataNode实例。在HDFS中,NameNode节点被称为名称节点,DataNode节点被称为数据节点。DataNode节点通过心跳机制与NameNode节点进行定时的通信。
HDFS架构图
(4)配置Spark
最初采用Hadoop自有MapReduce计算框架可以解决大多数问题,但相比Spark计算框架就略逊一筹。Spark框架相比MR来说更加的高效,有如下几个原因:
1.相对于Hadoop的MR计算,Spark支持DAG,能缓存中间数据,减少数据落盘数,Spark基于内存的计算更高效
2.可以支持使用多线程启动task,更轻量,启动速度快;
3.API高度抽象,开发效率高,功能不局限于MapReduce的传统模式,可以根据实际的需求设计程序。
Spark+HDFS架构
但Spark没有自带的文件系统,所以使用Hadoop的HDFS配合进行相关计算,具体结构图如上。
在分布式环境中安装Spark,并配置相关文件。
本节具体配置参考:https://www.cnblogs.com/NextNight/p/6703362.html
(三)并行程序的选择至此分布式计算的集群搭建好,具备了分布式计算的基本条件。通过对Spark进一步剖析,理解分布式程序的开发。
RDD的使用
Spark的核心为RDD(Resilient Distributed Datasets),即弹性分布式数据集。
它是对数据的高度抽象概念,弹性可理解为数据存储弹性,可内存,可磁盘; 分布式可理解为数据分布在不同节点。RDD是分布式数据的逻辑抽象,物理数据存储在不同的节点上,但对用户透明,用户不需要知道数据实际存在哪台机器。
RDD包括以下部分:
只读分区集合:这保证了RDD的一致性,在计算过程中更安全可靠,此外RDD可能包含多个分区,数据分布在不同分区中,这些分区可能在不同的机器上。对数据的计算函数:RDD包含了对所表示数据的计算函数,也就是得到这个RDD所要经过的计算。计算数据的位置:对用户而言不需要知道数据在哪里,这些信息隐含在RDD的结构中。分区器:对数据分区依赖的分区算法,如hash分区器依赖的RDD信息:该RDD可能依赖的父RDD信息,用于失败重算或计算的DAG划分。
RDD的计算与依赖
RDD计算
RDD的计算分为transformation和action两类。
transformation有 flatMap、map、union、reduceByKey等。
action有count、collect、saveAsTextFile等表示输出的操作。
RDD的计算是lazy的,transformation算子不会引发计算,只是逻辑操作action算子才会引发实际的计算。
RDD依赖
宽依赖窄依赖
RDD的依赖分为宽依赖和窄依赖两种,如果依赖过程含有一对多则为宽依赖,否则为窄依赖。
Spark的计算流程
Spark的计算核心为RDD,理解了RDD才能理解其相关计算流程。
上图是一个Spark的wordcount例子,根据上述stage划分原则,这个job划分为2个stage,有三行,分别是数据读取、计算和存储过程。
仅看代码,用户根本体会不到数据在背后是并行计算。从图中能看出数据分布在不同分区(也可以理解不同机器上),数据经过flapMap、map和reduceByKey算子在不同RDD的分区中流转。(这些算子就是上面所说对RDD进行计算的函数)
Spark实现流程
更抽象的层次来看:Spark的运行架构由Driver(可理解为master)和Executor(可理解为worker或slave)组成,Driver负责把用户代码进行DAG切分,划分为不同的Stage,然后把每个Stage对应的task调度提交到Executor进行计算,这样Executor就并行执行同一个Stage的task。
层次划分
Application就是用户submit提交的整体代码,代码中又有很多action操作,action算子把Application划分为多个job,job根据宽依赖划分为不同Stage,Stage内划分为许多(数量由分区决定,一个分区的数据由一个task计算)功能相同的task,然后这些task提交给Executor进行计算执行,把结果返回给Driver汇总或存储。
这体现了 Driver端总规划–Executor端分计算–结果最后汇总回Driver 的思想,也就是分布式并行计算的思想。
(四)并行计算实例采用Spark计算框架,对矢量点进行高斯核密度估计。
单机环境测试,采用不同的线程数对程序进行计算,模拟并行计算的结果比较计算结果。使用Geotrellis.Spark框架下的瓦片处理技术将点分配到不同的瓦片Tile,并将其导入RDDtile中,进行并行计算。
初始化Sparkconf设置setMaster参数为Local[线程数]进行试验,计算其核心步骤的时间,结果如下:
线程数 瓦片切割 使用时间(ms)
1 7*4 64455
2 7*4 46455
4 7*4 35583
基本可以说明在数据量较大的情况下,并行计算的效率要较高一些。但是线程数的增加使得并行计算的通行网络成本与时间网络成本增加,所以不同的任务有最高值,需要配置服务器,使用更多数据通过更多的线程数来进行进一步计算得到。