热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spark的基本概念

Spark的基本概念基本组成Spark是一个分布式系统,也是集多个功能模块于一身的统一平台。它基于一个内核模块衍生出机器学习,实时流计算,OLAP,和图数据处理等模块,如图1-

Spark的基本概念


基本组成

Spark是一个分布式系统,也是集多个功能模块于一身的统一平台。它基于一个内核模块衍生出机器学习,实时流计算,OLAP,和图数据处理等模块,如图1-1-1所示。本书主要介绍Spark内核模块的实现原理。

图1-1-1 spark功能模块
​ 图1-1-1 spark功能模块

从图1-1-1中可以看出Spark内核模块是基础层,它是所有上层功能模块的基础。所有上层的功能模块都使用Spark内核模块提供的接口来实现其功能。


Spark应用执行的基本架构

Spark应用可以在多种资源管理框架中执行,由于在Spark应用执行前,资源管理框架的各个服务已经启动(Local模式除外),所以,区分Spark应用执行时创建的服务和资源框架提供的服务非常重要。
在这里插入图片描述
图1-1-2 Spark应用执行架构

图1-1-2是Spark应用执行时的基本架构图。图中用两种颜色进行了标识,其中浅绿色的方块是资源管理框架的服务,比如:YARN模式的Resource Manager(对应Cluster Manager)和Node Manager(对应Worker节点);又比如,Standalone模式下的Master和Worker服务。要注意的是:这些服务在Spark应用程序提交和执行前就一直处于运行状态,Spark应用运行运行在资源管理平台之上,当执行Spark应用程序时,会向资源管理器(Cluster Manager)申请运行资源。

而淡蓝色的模块是Spark应用执行时才启动的服务或对象,比如:Spark Session和Executor,当Spark应用执行完成后,这些服务或对象以及运行Spark应用所占用的资源就会被回收。

下表是图1-1-2中各个角色的简要说明,后面还会针对每个角色进行详细分析。




































角色名归属说明
Cluster Manager资源管理框架负责为运行在资源管理跨框架上的应用程序分配资源。
Worker资源管理框架根据Cluster Manager的指令分配资源,执行应用程序,释放资源。
DriverSpark应用Spark应用程序的Driver端,Spark应用由Driver驱动执行。
ExecutorSpark应用Spark应用程序的执行端,在执行Spark应用时创建,执行完成后被回收。
SparkSessionSpark应用Spark应用的核心元素,通过它来初始化Spark应用的环境。在Spark应用执行时创建。执行完成后关闭。

资源管理框架

随着分布式应用越来越多,为了更好的利用和管理CPU和内存资源,诞生了许多分布式资源管理框架。通过这些资源管理框架可以更好的为分布式应用分配和管理计算资源。比如:Hadoop使用了YARN作为资源管理框架,另外还诞生了开源的Mesos等;随着云计算的发展,诞生了Kubernetes等。

Spark也支持了这几种主流的资源管理框架,Spark应用可以运行在这几种资源管理框架之上。另外,Spark还自己实现了一套资源管理框架。在执行Spark应用时,可以指定使用哪种资源管理框架。

表1-1-1是各种资源管理框架的角色和Spark应用执行架构中角色的对应关系表。由于Spark对Kubernetes的支持还处于试验阶段,所以,这里暂不介绍。


























资源管理框架Cluster ManagerWorker
Spark自带Master服务Worker服务
YarnResouce Manager服务Node Manager服务
MesosMesos master服务Mesos Agent服务

​ 表1-1-1 资源管理框架和Spark架构角色对应关系


Spark应用的组成

Spark应用(Application)是用户基于Spark编写的应用程序。它由一个Driver进程和一组Executor进程组成,它们都是在Spark应用执行时创建,应用执行完成后即被回收。Spark应用可以使用多种语言编写:python,R,java,scala等。

Spark应用可以运行在图1-1-1所描述的三种资源管理框架中,也可以以Local模式运行。在Local模式下Driver和Executor都在同一个JVM中运行,Local模式的详细运行原理在“Local模式”一节中进行分析。


Driver


Driver的职责

Driver负责启动Spark应用,驱动应用的执行。它对Spark应用的整个执行过程进行管控,它是Spark应用程序的"master"(注意不要和资源管理框架的master混淆。这样称呼主要因为:在Spark应用执行时,Driver端会启动很多服务的master端,这些服务的slave端运行在Executor上,这些服务的slave会向Driver端对应的master注册或汇报运行状态信息)。

Driver通过运行Spark应用的main函数来执行应用,从应用开始执行到把Task提交到Executor端有很多步骤,这些步骤都在Driver端完成。Driver端会把应用进行编排,最终会生成一个个的Task,并提交给Executor去执行,当Task被提交到Executor端后,Driver会和Executor进行通信,实时监控执行状态。总的来说Driver需要完成以下几个方面的工作:



  • 通过运行Spark应用的main函数来启动Spark应用;

  • 向资源管理平台申请资源,并在Worker节点上启动Executor;

  • 创建SparkSession(包括SparkContext和SparkEnv),并对Spark应用进行规划,编排,最后提交到Executor端执行;

  • 收集Spark应用的执行状态,并返回执行结果;

注意,Driver也可以运行在资源管理框架的某个节点上(例如:yarn cluster模式下运行在Application Master中 )。


Driver的资源配置

由于Driver端是Spark应用执行的核心,有时候我们需要对其资源进行设置,可以通过以下方式来对Driver的内存和CPU个数进行设置:



  • 配置Driver的内存:

    • 通过spark-submit’s --driver-memory 选项进行设置;

    • 通过spark.driver.memory参数进行配置,默认是:1G;



  • 配置Driver使用的CPU个数:

    • 通过spark-submit’s --driver-cores选项进行设置;

    • 通过spark.driver.cores参数进行设置,默认是1;




Executor

1)Executor的创建

Executor是在执行Spark应用时由执行后台服务创建。创建多少个Executor,每个Executor使用多少内存和CPU都可以通过参数进行指定。但注意:Local运行模式和其他模式不同,Local模式下只会创建一个Executor。

2)Executor的职责

Executor是执行Spark应用的容器,顾名思义,它的职责就是根据Driver端的要求来启动执行线程,执行任务,并返回执行结果。

3)Executor的资源配置

每次执行Spark任务时,都可以对Executor的个数,每个Executor的CPU和内存大小等进行配置。Executor的这些配置非常关键,会直接影响Spark任务的执行效率。


Job

Job是Spark应用执行层次结构中的最高层元素。我们知道,Spark应用的通过Driver端的程序来驱动应用的执行,在Spark应用程序中,每个RDD的Action操作都对应一个Job。

每个Job会划分成一系列的Stage, Stage的数量依赖于发生过多少次shuffle操作。


Stage

每个Job都被划分为一些较小的任务集(Task Set),这些任务集称为Stage。这些Stage相互依赖,从而形成一个Stage的DAG图(有向无环图)。


Task

发送给Executor端执行的工作单元。每个RDD的分区对应一个Task,也就是说,触发任务执行的RDD有多少个分区就会创建多少个Task。Task的创建是在Driver端完成,而Task的执行在Executor端。Executor会创建一个线程池来执行Task,每个Task对应一个执行线程。


SparkSession

SparkSession是Spark SQL的入口点。它是您在开发Spark SQL应用程序时首先要创建的对象之一。在创建SparkSession时,会同时创建SparkContext和SparkEnv。

在SparkSession中提供了多种创建Dataset和DataFrame的方法。


SparkContext

该进程运行应用程序的main()函数并创建SparkContext。在创建SparkContext时,会为Spark应用准备执行环境,包括各种服务的初始化,各种工具类的创建等。

在创建SparkContext时会和ResourceManager通信来申请任务执行资源,当SparkContext创建完成时Spark应用的执行环境就准备完成了,包括:Driver端完成各种初始化服务的启动,Worker端的完成Executor的创建。


Spark的编程接口

Spark提供了3种编程接口:RDD,Dataframe,SparkSql,三者的区别与联系如下表:


































































RDDDataFrameSparksql
不可变YesYesYes
表结构NoYesYes
Spark V1YesYesYes
Spark V2YesYesYes
性能优化NoYesYes
数据类型支持YesNoYes
语法错误检查编译时编译时编译时
错误分析编译时运行时编译时
语言支持都支持Python,java,scala,R

从上表我们可以看出:

1)DataFrame和SparkSql是带有schema的结构化数据结构,因为有了Schema,所以会让数据更容易理解和使用。

2)DataFrame和SparkSql会对用户编写的代码进行优化,而Spark不会对RDD进行优化,因为它已经是最底层的基本元素了。实际上,在执行DataFrame和SparkSql任务时,会经过从逻辑执行计划到物理执行计划,再到RDD的代码生成等一系列的步骤,而这些步骤的目的就是为了得到RDD的最优化执行代码。

3)另外还要注意,DataFrame支持的语言是有限制的。


小结

本文介绍了Spark的基本架构,和Spark应用的基本组成。通过本文可以对Spark有一个总体的概念,这对于理解其原理打下一个基础。


推荐阅读
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Go语言实现文件读取与终端输出
    本文介绍如何使用Go语言编写程序,通过命令行参数指定文件路径,读取文件内容并将其输出到控制台。代码示例中包含了错误处理和资源管理的最佳实践。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 探索Java 11中的ZGC垃圾收集器
    Java 11引入了一种新的垃圾收集器——ZGC,由Oracle公司研发,旨在支持TB级别的内存容量,并保证极低的暂停时间。本文将探讨ZGC的开发背景、技术特点及其潜在的应用前景。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
author-avatar
小女人hoffix_523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有