天天看点

《深入理解Spark:核心思想与源码分析》——2.3节Spark基本设计思想

本节书摘来自华章社区《深入理解spark:核心思想与源码分析》一书中的第2章,第2.3节spark基本设计思想,作者耿嘉安,更多章节内容可以访问云栖社区“华章社区”公众号查看

2.3 spark基本设计思想

2.3.1 spark模块设计

整个spark主要由以下模块组成:

spark core:spark的核心功能实现,包括:sparkcontext的初始化(driver application通过sparkcontext提交)、部署模式、存储体系、任务提交与执行、计算引擎等。

spark sql:提供sql处理能力,便于熟悉关系型数据库操作的工程师进行交互查询。此外,还为熟悉hadoop的用户提供hive sql处理能力。

spark streaming:提供流式计算处理能力,目前支持kafka、flume、twitter、mqtt、zeromq、kinesis和简单的tcp套接字等数据源。此外,还提供窗口操作。

graphx:提供图计算处理能力,支持分布式,pregel提供的api可以解决图计算中的常见问题。

mllib:提供机器学习相关的统计、分类、回归等领域的多种算法实现。其一致的api接口大大降低了用户的学习成本。

spark sql、spark streaming、graphx、mllib的能力都是建立在核心引擎之上,如图2-4所示。

《深入理解Spark:核心思想与源码分析》——2.3节Spark基本设计思想

spark核心功能

spark core提供spark最基础与最核心的功能,主要包括以下功能。

sparkcontext:通常而言,driver application的执行与输出都是通过sparkcontext来完成的,在正式提交application之前,首先需要初始化sparkcontext。sparkcontext隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、测量系统、文件服务、web服务等内容,应用程序开发者只需要使用sparkcontext提供的api完成功能开发。sparkcontext内置的dagscheduler负责创建job,将dag中的rdd划分到不同的stage,提交stage等功能。内置的taskscheduler负责资源的申请、任务的提交及请求集群对任务的调度等工作。

存储体系:spark优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,这极大地减少了磁盘i/o,提升了任务执行的效率,使得spark适用于实时计算、流式计算等场景。此外,spark还提供了以内存为中心的高容错的分布式文件系统tachyon供用户进行选择。tachyon能够为spark提供可靠的内存级的文件共享服务。

计算引擎:计算引擎由sparkcontext中的dagscheduler、rdd以及具体节点上的executor负责执行的map和reduce任务组成。dagscheduler和rdd虽然位于sparkcontext内部,但是在任务正式提交与执行之前会将job中的rdd组织成有向无关图(简称dag),并对stage进行划分,决定了任务执行阶段任务的数量、迭代计算、shuffle等过程。

部署模式:由于单节点不足以提供足够的存储及计算能力,所以作为大数据处理的spark在sparkcontext的taskscheduler组件中提供了对standalone部署模式的实现和yarn、mesos等分布式资源管理系统的支持。通过使用standalone、yarn、mesos等部署模式为task分配计算资源,提高任务的并发执行效率。除了可用于实际生产环境的standalone、yarn、mesos等部署模式外,spark还提供了local模式和local-cluster模式便于开发和调试。

spark扩展功能

为了扩大应用范围,spark陆续增加了一些扩展功能,主要包括:

spark sql:sql具有普及率高、学习成本低等特点,为了扩大spark的应用面,增加了对sql及hive的支持。spark sql的过程可以总结为:首先使用sql语句解析器(sqlparser)将sql转换为语法树(tree),并且使用规则执行器(ruleexecutor)将一系列规则(rule)应用到语法树,最终生成物理执行计划并执行。其中,规则执行器包括语法分析器(analyzer)和优化器(optimizer)。hive的执行过程与sql类似。

spark streaming:spark streaming与apache storm类似,也用于流式计算。spark streaming支持kafka、flume、twitter、mqtt、zeromq、kinesis和简单的tcp套接字等多种数据输入源。输入流接收器(receiver)负责接入数据,是接入数据流的接口规范。dstream是spark streaming中所有数据流的抽象,dstream可以被组织为dstream graph。dstream本质上由一系列连续的rdd组成。

graphx:spark提供的分布式图计算框架。graphx主要遵循整体同步并行(bulk synchronous parallell,bsp)计算模式下的pregel模型实现。graphx提供了对图的抽象graph,graph由顶点(vertex)、边(edge)及继承了edge的edgetriplet(添加了srcattr和dstattr用来保存源顶点和目的顶点的属性)三种结构组成。graphx目前已经封装了最短路径、网页排名、连接组件、三角关系统计等算法的实现,用户可以选择使用。

mllib:spark提供的机器学习框架。机器学习是一门涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多领域的交叉学科。mllib目前已经提供了基础统计、分类、回归、决策树、随机森林、朴素贝叶斯、保序回归、协同过滤、聚类、维数缩减、特征提取与转型、频繁模式挖掘、预言模型标记语言、管道等多种数理统计、概率论、数据挖掘方面的数学算法。

2.3.2 spark模型设计

spark编程模型

spark 应用程序从编写到提交、执行、输出的整个过程如图2-5所示,图中描述的步骤如下。

1)用户使用sparkcontext提供的api(常用的有textfile、sequencefile、runjob、stop等)编写driver application程序。此外sqlcontext、hivecontext及streamingcontext对spark-context进行封装,并提供了sql、hive及流式计算相关的api。

2)使用sparkcontext提交的用户应用程序,首先会使用blockmanager和broadcast-manager将任务的hadoop配置进行广播。然后由dagscheduler将任务转换为rdd并组织成dag,dag还将被划分为不同的stage。最后由taskscheduler借助actorsystem将任务提交给集群管理器(cluster manager)。

3)集群管理器(cluster manager)给任务分配资源,即将具体任务分配到worker上,worker创建executor来处理任务的运行。standalone、yarn、mesos、ec2等都可以作为spark的集群管理器。

rdd计算模型

rdd可以看做是对各种数据计算模型的统一抽象,spark的计算过程主要是rdd的迭代计算过程,如图2-6所示。rdd的迭代计算过程非常类似于管道。分区数量取决于partition数量的设定,每个分区的数据只会在一个task中计算。所有分区可以在多个机器节点的executor上并行执行。

《深入理解Spark:核心思想与源码分析》——2.3节Spark基本设计思想

继续阅读