Spark:partition、task、executor关系

spark中执行任务会显示如下格式的进度:
[Stage 4:=========================>                              (12 + 11) / 24]
# 这是stage4阶段:
## 共有24个task(一个partition对应一个task,所以有24个partition)
## 当前正在并行执行的task数量为11。
## 这里没有executor数,因为一个executor里可以同时执行多个task(每个task至少要占用一个虚拟核vcore)
## 已经有12个task执行完成

观察这个进度过程有利于看出是否存在数据倾斜:若其中1个task的完成时间明显高于其他task,说明很可能这个task处理的数据量多于其他task。

executor和task关系:

一个executor可以并行执行多个task,实际上一个executor是一个进程,task是executor里的一个线程。
一个task至少要独占executor里的一个虚拟核心vcore。
一个executor里的核心数由spark-submit的--executor-cores参数指定。
一个task要占用几个核心,可以由.config("spark.task.cpus", 1)配置,默认是1即一个task占用一个vcore。

同时并行执行的task最大数量 = executor数目 * (每个executor核数 / 每个task占用核心数)

任务执行快结束可能会变成这样:
[Stage 4:=============================================>          (22 + 2) / 24]

因为这时候还有2个task没有完成,此时有些executor可能已经空闲下来了。


DataFrameReader读取csv和json如果设了如下选项,会造成生成的DataFrame只有一个partition,也就是只有一个task:

.option("multiLine", true)  
//加入此行会造成生成的DataFrame只有一个partition

因为spark要考虑读取多行解析文件数据,所以不能进行文件的随意分割。

相反,如果是单行模式则可以以任意行结束符进行分割,就能并行读取,生成的DataFrame就能有多个分区。
如果要读取的文本文件在hdfs上,生成DataFrame的分区数等于原始文件的block数。如1345MB文件,block大小128MB,会生成11个partition(1345/128=10.5)。

查看Dataset分区数:
ds.rdd.getNumPartitions
改变分区数:
ds.repartition #能任意改变分区数,但是速度慢
ds.coalesce #只能减少分区数,对平衡数据倾斜有效,而且是窄依赖所以速度块。

转载于:https://www.cnblogs.com/xuejianbest/p/10284987.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClusterManager:在Standalone模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器。 Worker:从节点,负责控制计算节点,启动Executor。在YARN模式中为NodeManager,负责计算节点的控制。 Driver:运行Application的main()函数并创建SparkContext。 Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。 SparkContext:整个应用的上下文,控制应用的生命周期。 RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。 DAG Scheduler:实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。 TaskScheduler:将任务(Task)分发给Executor执行。 Stage:一个Spark作业一般包含一到多个Stage。 Task:一个Stage包含一到多个Task,通过多个Task实现并行运行的功能。 Transformations:转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。 Actions:操作(Actions) (如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。 SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。 SparkEnv内创建并包含如下一些重要组件的引用。 MapOutPutTracker:负责Shuffle元信息的存储。 BroadcastManager:负责广播变量的控制与元信息的存储。 BlockManager:负责存储管理、创建和查找块。 MetricsSystem:监控运行时性能指标信息。 SparkConf:负责存储配置信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值