spark原理详情记录_spark的基本计算单元是-程序员宅基地

技术标签: spark  

1、spark是什么?

  快速,通用,可扩展的分布式计算引擎

2、弹性分布式数据集RDD

  RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。

RDD的属性


1)一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。

2)一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。

3)RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。

4)一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。

5)一个列表,存储存取每个Partition的优先位置(preferred location)。对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

创建RDD的两种方式

  1、由一个已经存在的Scala集合创建。

    val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))

  2、由外部存储系统的数据集创建,包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等

    val rdd2 = sc.textFile("hdfs://node1.itcast.cn:9000/words.txt")

Spark专业术语定义

1、Application:Spark应用程序

指的是用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。

Spark应用程序,由一个或多个作业JOB组成

2、Driver:驱动程序

Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver

driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程,driver本身会根据我们设置的参数占有一定的资源(主要指cpu core和memory)。下面说一说driver和executor会做哪些事。

driver可以运行在master上,也可以运行worker上(根据部署模式的不同)。driver首先会向集群管理者(standalone、yarn,mesos)申请spark应用所需的资源,也就是executor,然后集群管理者会根据spark应用所设置的参数在各个worker上分配一定数量的executor,每个executor都占用一定数量的cpu和memory。在申请到应用所需的资源以后,driver就开始调度和执行我们编写的应用代码了。driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks,然后将这些tasks分配到各个executor中执行。

executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task,executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。此外executor还有一个功能就是为应用程序中要求缓存的 RDD 提供内存式存储,RDD 是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算

3、Cluster Manager:资源管理器

指的是在集群上获取资源的外部服务,常用的有:Standalone,Spark原生的资源管理器,由Master负责资源的分配;Haddop Yarn,由Yarn中的ResearchManager负责资源的分配;Messos,由Messos中的Messos Master负责资源管理

4、Executor:执行器

Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor

可通过配置并发度和setNumTask来配置一个executor同时处理多少个task。默认情况下一个executor就处理一个task。如果处理多个task,executor会循环遍历执行task

5、Worker:计算节点

集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点

6、RDD:弹性分布式数据集

Resillient Distributed Dataset,Spark的基本计算单元,可以通过一系列算子进行操作(主要有Transformation和Action操作)

7、窄依赖

父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD 的分区

8、宽依赖

父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区

常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖)。

常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是宽依赖)。

9、DAG:有向无环图

Directed Acycle graph,反应RDD之间的依赖关系

10、DAGScheduler:有向无环图调度器

基于DAG划分Stage 并以TaskSet的形势提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler

11、TaskScheduler:任务调度器

将Taskset提交给worker(集群)运行并回报结果;负责每个具体任务的实际物理调度

12、Job:作业

由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Spark Action催生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation。

13、Stage:调度阶段

一个任务集对应的调度阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;Stage分成两种类型ShuffleMapStage、ResultStage

14、TaskSet:任务集

由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集

1)一个Stage创建一个TaskSet;
2)为Stage的每个Rdd分区创建一个Task,多个Task封装成TaskSet

15、Task:任务

被送到某个Executor上的工作任务;单个分区数据集上的最小处理流程单元

总体如图

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34495753/article/details/90439726

智能推荐

nRF24L01无线模块使用1---电平转换-程序员宅基地

文章浏览阅读2.5k次。手里还有若干stc12c5a60s2,所以决定用它来驱动nRF24L01模块nRF24L01模块供电是3.3v的,所以i/o电平需要跟5v的stc12c5a60s2兼容。看了nRF24L01的手册,查了网上一些网友的使用心得,发现nRF24L01的I/O可以直接跟5V的51单片机直连。供电加一片ASM1117-3.3即可

分库分表介绍以及shardingjdbc实现分库分表-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏18次。分库分表是在海量数据下,由于单库、表数据量过大,导致数据库性能持续下降的问题,演变出的技术方案。分库分表是由分库和分表这两个独立概念组成的,只不过通常分库与分表的操作会同时进行,以至于我们习惯性的将它们合在一起叫做分库分表。通过一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。_分库分表

Python-Django毕业设计校园学生管理系统(程序+Lw)_django学生信息管理系统源码-程序员宅基地

文章浏览阅读278次。该项目含有源码、文档、程序数据库、配套开发软件、软件安装教程项目运行环境配置:Pychram社区版py项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。推荐pycharm社区版;3.mysql环境:建议是用5.7版本均可。_django学生信息管理系统源码

HTML5+CSS大作业——汽车专题网页设计(1页) dreamweaver作业静态HTML网页设计模板_汽车专题页-程序员宅基地

文章浏览阅读1k次。HTML5+CSS大作业——汽车专题网页设计(1页) dreamweaver作业静态HTML网页设计模板常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业, 可满足大学生网页大作业网页设计需求, 喜欢的可以下载!获取更多源码PC电脑_汽车专题页

【uniapp】uniapp中刷新本页面_uniapp刷新当前页面-程序员宅基地

文章浏览阅读5.7w次,点赞23次,收藏78次。记录刷新当前页面方法_uniapp刷新当前页面

分布式场景实战第一节 冷热分离和查询分离_mongodb 冷查询 和热查询特点-程序员宅基地

文章浏览阅读1.1k次。开篇词 学好软件架构,先从场景入手你好,我是韦木,曾是硅谷上市公司的一名技术总监,拥有 15 年互联网技术研发经验。随着社会节奏的日益加快,碎片化学习逐渐成了我们获取知识的主要方式。在技术学习上,我也是一个碎片化学习的人,也因此我发现学习到的东西往往零散琐碎、不系统,只是让我感觉好像学到了很多东西。犹记得刚学习 Spring 时,每当看到 Spring 的代码示例,我先是恍然大悟:“哦,原来 Spring 还有这个功能啊”,然后赶紧把这段代码示例拷贝放入自己的代码库里。琢磨一番后:“哎呀_mongodb 冷查询 和热查询特点

随便推点

学生成绩管理系统设计报告python_学生成绩管理系统(python)的实现-程序员宅基地

文章浏览阅读621次。学生成绩管理系统功能:增加。删除。改变。检查。排序。这五个部分组成。都是由独立的功能。信息的访问字典形式表达。# student_ #插入学生信息def input_student():信息=[]尽管如此:n =输入(\u201C请输入学生姓名:\u201D)如果不是n: breaka = int(输入(\lis =排序(L键=λd: d(\u201C分数\u201D),反向= True) out..._python课程学生成绩管理系统设计

WEEK4 C 作业_java:求下列式子的值:1+1/2+1/......+1/99+1/100,将结果输出。-程序员宅基地

文章浏览阅读355次。1 输入一行字符,分别统计出其中字母,空格,数字和其他字符的个数#include void main(){ int letter, space, num, other; char ch; letter = space = num = other = 0; while ((ch = getchar ()) != '\n') { _java:求下列式子的值:1+1/2+1/......+1/99+1/100,将结果输出。

Pycharm 一键加引号、批量加引号_pycharm一键加引号-程序员宅基地

文章浏览阅读5.8k次,点赞9次,收藏24次。引言:很多时候我们处理脚本(例如涉及接口脚本)会使用大量键值对加引号的操作,如果是只有个别的键值对需要添加引号还好,如果量较大,手动添加引号无疑是很糟心的事情。**解决方式如下:**..._pycharm一键加引号

anchor-free目标检测_关键点检测和目标检测的区别-程序员宅基地

文章浏览阅读5k次,点赞6次,收藏43次。本文介绍anchor-free目标检测的发展。_关键点检测和目标检测的区别

dbm,dbi,dbd,db,dbc的区别是什么_dbic dbi-程序员宅基地

文章浏览阅读2k次。都是功率增益的单位。1、dBmdBm是一个表征功率绝对值的量,计算公式为:10lgP(功率值/1mw)。[例1] 如果发射功率P为1mw,折算为dBm后为0dBm。[例2] 对于40W的功率,按dBm单位进行折算后的值应为:10lg(40W/1mw)=10lg(40000)=10lg4+10lg10+10lg1 000=46dBm。2、dBi 和dBddBi和dBd是表征增..._dbic dbi

python实现多表格合并_Python将多个excel表格合并为一个表格-程序员宅基地

文章浏览阅读1k次。在生活中,我们经常会遇到这样的情况,即多个excel表格聚合为一种形式。例如,你分发表单班上所有学生填写,你负责结合成一个每个人的结果。有很多这样的问题。除了手动将所有表的内容复制到汇总表,如何使用Python自动实现这些任务~我不知道是否有更方便的方式合并,首先使用Python来实现这个功能,它非常方便使用它自己。作为一个例子,每个表的内容是一个运行的程序。7个表合并成开放。发现多个表的数据已经..._python实现同一文件夹下的多个excel表格合并为指定的表头excel表格中

推荐文章

热门文章

相关标签