任务中如何确定spark分区数、task数目、core个数、worker节点个数、excutor数量

1、任务中如何确定spark RDD分区数、task数目、core个数、worker节点个数、excutor数量

(1)hdfs 上的文件的存储形式是以 Block 的形式存储的,每个 File 文件都包含了很多块,一个Block默认是128M大小。当 spark 从 hdfs 上读取数据的时候,会根据具体数据格式对应的 InputFormat 进行解析,一般是将若干个Block合并成一个输入分片,称为 InputSplit,其中要注意InputSplit不能跨越文件 File。

(2)spark 会为这些分片生成具体的 task,InputSplit 与 Task 是一 一对应的关系,随后这些具体的 Task 每个都会被分配到集群上的某个节点的某个 Executor 去执行,每个 task 执行的结果就生成了RDD的一个 partiton。

  • 每个 worker 节点可以起一个或多个 Executor。
  • 每个 Executor 由若干 core 组成,每个 Executor 的每个 core 一次只能执行一个 Task。
  • 每个 Task 执行的结果就是生成了目标 RDD 的一个 partiton。

注意: 这里的 core 是虚拟的 core 而不是机器的物理 CPU 核,可以理解为就是 Executor 的一个工作线程。

Task被执行的并发度 = Executor数目 * 每个Executor核数(=core总个数)

2、RDD 中 partition 的数目:

  对于数据读入阶段,例如 sc.textFile,输入文件被划分为多少 InputSplit 就会需要多少初始 Task。

  在 Map 阶段 partition 数目保持不变。

  在 Reduce 阶段,RDD 的聚合会触发 shuffle 操作,聚合后的 RDD 的 partition 数目跟具体操作有关,例如 repartition 操作会聚合成指定分区数,还有一些算子是可配置的。

  RDD 在计算的时候,每个分区都会起一个 task,所以 rdd 的分区数目决定了总的 task 数目。

  申请的计算节点(Executor)数目和每个计算节点核数,决定了你同一时刻可以并行执行的 task。

例如:

  RDD有100个分区,那么计算的时候就会生成100个task,你的资源配置为10个计算节点,每个2个核,同一时刻可以并行的task数目为20,计算这个RDD就需要5个轮次。

  如果计算资源不变,你有101个task的话,就需要6个轮次,在最后一轮中,只有一个task在执行,其余核都在空转。

  如果资源不变,你的RDD只有2个分区,那么同一时刻只有2个task运行,其余18个核空转,造成资源浪费。

参考博客:https://blog.csdn.net/weixin_38750084/article/details/82725176

原文地址:https://www.cnblogs.com/guoyu1/p/12299170.html

时间: 2024-10-29 03:34:33

任务中如何确定spark分区数、task数目、core个数、worker节点个数、excutor数量的相关文章

spark分区数,task数目,core数,worker节点个数,excutor数量梳理

作者:王燚光链接:https://www.zhihu.com/question/33270495/answer/93424104来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block.当Spark读取这些文件作为输入时,会

Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题【转】

转自:http://www.cnblogs.com/yurunmiao/p/5195754.html 目前平台使用Kafka + Flume的方式进行实时数据接入,Kafka中的数据由业务方负责写入,这些数据一部分由Spark Streaming进行流式计算:另一部分数据则经由Flume存储至HDFS,用于数据挖掘或机器学习.HDFS存储数据时目录的最小逻辑单位为"小时",为了保证数据计算过程中的数据完整性(计算某个小时目录中的数据时,该目录的数据全部写入完毕,且不再变化),我们在Fl

Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN

Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Input DStreams 和 Receivers(接收器) DStreams 上的 Transformations(转换) DStreams 上的输出操作 DataFrame 和 SQL 操作 MLlib 操作 缓存 / 持久性 Checkpointing Accumulators, Broadcas

第三十七课 Spark之Task执行原理及结果

主要内容 1.     Task执行原理流程图 2.     Task执行源码 3.     Task执行结果在Driver端的处理 一.Task在Executor(worker)端执行及返回Driver流程图 图37-1 Driver端与Executor交互图 二.Executor(worker)端执行源码解析 1.接收Driver端发来的消息 当Driver中的SchedulerBackend给ExecutorBackend发送LaunchTask之后,ExecutorBackend在接收到

Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)

Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD 抽象 2.2 Spark 编程接口 2.2.1 例子 – 监控日志数据挖掘 2.3 RDD 模型的优势 2.4 不适合用 RDDs 的应用 3 Spark 编程接口 3.1 Spark 中 RDD 的操作 3.2 举例应用 3.2.1 线性回归 3.2.2 PageRank 4 表达 RDDs 5

Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN

Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession 创建 DataFrames 无类型的Dataset操作 (aka DataFrame 操作) Running SQL Queries Programmatically 全局临时视图 创建Datasets RDD的互操作性 使用反射推断Schema 以编程的方式指定Schema Aggregatio

spark 写入 redis 和 org.apache.spark.SparkException: Task not serializable

spark将数据写入redis时调用以下代码会报  org.apache.spark.SparkException: Task not serializable import com.redis.RedisClient val r = new RedisClient("192.168.1.101", 6379) val perhit = rdd.map(x => { val arr = x.split(" ") val k = arr(0).toInt val

spark出现task不能序列化错误的解决方法

应用场景:使用JavaHiveContext执行SQL之后,希望能得到其字段名及相应的值,但却出现"Caused by: java.io.NotSerializableException: org.apache.spark.sql.api.java.StructField"的错误,代码如下: JavaSparkContext sc = new JavaSparkContext(conf); JavaHiveContext sqlContext = new JavaHiveContext

Spark之Task原理分析

在Spark中,一个应用程序要想被执行,肯定要经过以下的步骤: 从这个路线得知,最终一个job是依赖于分布在集群不同节点中的task,通过并行或者并发的运行来完成真正的工作.由此可见,一个个的分布式的task才是Spark的真正执行者.下面先来张task运行框架整体的对Spark的task运行有个大概的了解. task运行之前的工作是Driver启动Executor,接着Executor准备好一切运行环境,并向Driver反向注册,最终Driver向Executor发送LunchTask事件消息