spark核心概念

DAG

所谓DAG就是有向无环图,其实就是个无环的流程,Spark的核心是根据RDD来实现的,Spark Scheduler!则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stage,

将每个Stage中的任务发到指定节点运行。基于Spark的任务调度原理,可以合理规划资源利用,做到尽可能用最少的资源高效地完成任务计算。

job与action

在spark中,job的概念,是一个rdd从创建到最终通过action算子执行的过程,我们在一个应用程序中可能会有多个rdd经过多次转换,多次聚合,每经过一次action聚合就算一个job,job个action是一一对应关系

DAG的宽窄依赖和阶段划分

窄依赖:父RDD的一个分区的数据,全部发送给子RDD的一个分区

下面是一个典型窄依赖的关系图

宽依赖:父RDD的一个分区的数据,发送给子RDD的多个分区,宽依赖的别名又叫shuffle。

区分宽窄依赖的一个方便方法就看一个分区根部是否存在多个分叉。

spark会根据宽依赖,划分阶段,每遇到宽依赖,就会分隔成两个阶段,划分完成后,每个阶段内部一定是窄依赖,如下两个stage之间,存在一个宽依赖的关系

内存迭代计算

Spark内存迭代的计算概念,也就是上面说的,DAG图会基于分区和宽窄依赖关系划分阶段,

一个阶段的内部都是窄依赖,窄依赖内,如果形成前后1:1的分区对应关系,就可以产生许多内存迭代计算的管道,这些内存迭代计算的管道,就是一个个具体的执行Task,一个Task是一个具体的线程,任务跑在一个线程内,就是走内存计算了,比如上面b1到p1的tupleRDD完全有一个线程负责,既没有网络交互,也没有线程间通信,就会最高效地完成数据b1的处理.

Spark为什么比MapReduce快

  • Spark的算子丰富,MapReduce算子匮乏(Map和Reduce),MapReduce这个编程模型,很难在一套MR中处理复杂的任务.很多的复杂任务,是需要写多个MapReducei进行串联.多个MR串联通过磁盘交互数据
  • Spark可以执行内存迭代,算子之间形成DAG基于依赖划分阶段后,在阶段内形成内存迭代管道.但是MapReducel的Map和Reduce之间的交互依旧是通过硬盘来交互的.

spark并行度设置

spark并行度指示的是spark允许并行运行的task数,spark会根据并行的task数来设置分区数,一般来说,并行task数和分区数一一对应,

  • 如何设置并行度
    可以在代码中和配置文件中以及提交程序的客户端参数中设置
    优先级从高到低:
    1、代码中
    conf SaprkConf)
    conf.set("spark.default.parallelism","100")
    2、客户端提交参数中
    bin/spark-submit --conf "spark.default.parallelism=100"
    3、配置文件中
    conf/spark-defaults.conf中设置
    spark.default.parallelism 100
    4、默认(1,但是不会全部以1来跑,多数时候基于读取文件的分片数量来作为默认并行度)
    全局并行度配置的参数:
    spark.default.parallelism

注意

  • 全局并行度是推荐设置,不要针对RDD调整分区,很可能影响到内存迭代管道计算,造成额外的shuffle
  • 如果一定要针对某个RDD来调整分区,可以用之前提到过的三个算子:
    (1)repartition算子
    (2)coalesce算子
    (3)partitionBy算子
    调整也建议往下调,不要增加分区

集群中如何规划并行度

  • 设置为CPU总核心的2~10倍
    比如集群可用CPU核心是100个,我们建议并行度是200~1000
    确保是CPU核心的整数倍即可,最小是2倍,最大一般10倍或更高(适量)均可
  • 为什么要设置最少2倍?
    CPU的一个核心同一时间只能千一件事情
    所以,在100个核心的情况下,设置100个并行,就能让CPU100%出力.
    这种设置下,如果task的压力不均衡,某个task先执行完了.就导致某个cPU核心空闲
    所以,我们将Task(并行)分配的数量变多,比如800个并行,同一时间只有100个在运行,700个在等待.但是可以确保,某个task运行完了.后续有task补上,不让cpu闲下来,最大程度利用集群的资源.
    规划并行度,只看集群总CPU核数
    在pyspark中,一个task只能处理一个RDD的一个分区,有几个分区,就有几个task来处理它,一个rdd如果有两个分区,就会有两个task来处理它。

Spark的任务调度

Spark的任务,由Driver进行调度,这个工作包含:

1、逻辑DAG产生

2、分区DAG产生

3、Task划分

4、将Task分配给Executor并监控其工作

如上图

Driver被构建出来后,构建SparkContext(执行环境入口对象),之后基于DAG Scheduler(DAG调度器)构建逻辑Task分配,基于TaskScheduler(Task调度器)将逻辑Task分配到各个Executor.上干活,并监控它们,Worker(Executor)被TaskScheduler管理监控,听从它们的指令干活,并定期汇报进度,DAG调度器和Task调度器是spark的核心调度器,其中DAG调度器决定了task数和任务cpu分配,task调度器只是决定task分配到哪个executor。

相关推荐
bubble小拾2 小时前
ElasticSearch高级功能详解与读写性能调优
大数据·elasticsearch·搜索引擎
ZOHO项目管理软件2 小时前
EDM平台大比拼 用户体验与营销效果双重测评
大数据
weixin_453965002 小时前
[单master节点k8s部署]31.ceph分布式存储(二)
分布式·ceph·kubernetes
坎坎坷坷.2 小时前
分布式理论:拜占庭将军问题
分布式
HyperAI超神经3 小时前
Meta 首个多模态大模型一键启动!首个多针刺绣数据集上线,含超 30k 张图片
大数据·人工智能·深度学习·机器学习·语言模型·大模型·数据集
Hello.Reader5 小时前
TopK算法在大数据重复数据分析中的应用与挑战
大数据·算法·数据分析
数据龙傲天5 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
Elastic 中国社区官方博客5 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
Jason不在家7 小时前
Flink 本地 idea 调试开启 WebUI
大数据·flink·intellij-idea
Elastic 中国社区官方博客8 小时前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索