热门标签 | 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有一个总体的概念,这对于理解其原理打下一个基础。


推荐阅读
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文介绍了Java中的com.sun.codemodel.JBlock._continue()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
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社区 版权所有