社区首页 >问答首页 >为什么在我的spark工作中有这么多任务?默认获取200个任务

为什么在我的spark工作中有这么多任务?默认获取200个任务
EN

Stack Overflow用户
提问于 2016-06-11 00:00:36
回答 2查看 17.4K关注 0票数 23

我有一个spark作业,它从hdfs中获取一个包含8条记录的文件,执行简单的聚合并将其保存回hdfs。当我这样做的时候,我注意到有成百上千的任务。

我也不确定为什么会有多个工作要做?我认为工作更像是行动发生的时候。我可以推测原因--但我的理解是,在这段代码中,它应该是一个作业,它应该被分成几个阶段,而不是多个作业。为什么不把它分成几个阶段,为什么它会分成几个工作呢?

至于200多个任务,由于数据量和节点量微不足道,当只有一个聚合和几个筛选器时,每行数据有25个任务是没有意义的。为什么它不能在每个原子操作的每个分区上只有一个任务?

以下是相关的scala代码-

代码语言:javascript
代码运行次数:0
复制
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object TestProj {object TestProj {
  def main(args: Array[String]) {

    /* set the application name in the SparkConf object */
    val appConf = new SparkConf().setAppName("Test Proj")

    /* env settings that I don't need to set in REPL*/
    val sc = new SparkContext(appConf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val rdd1 = sc.textFile("hdfs://node002:8020/flat_files/miscellaneous/ex.txt")

     /*the below rdd will have schema defined in Record class*/
     val rddCase =  sc.textFile("hdfs://node002:8020/flat_files/miscellaneous/ex.txt")
      .map(x=>x.split(" "))    //file record into array of strings based spaces
      .map(x=>Record(
        x(0).toInt,
        x(1).asInstanceOf[String],
        x(2).asInstanceOf[String],
        x(3).toInt))


    /* the below dataframe groups on first letter of first name and counts it*/
    val aggDF = rddCase.toDF()
      .groupBy($"firstName".substr(1,1).alias("firstLetter"))
      .count
      .orderBy($"firstLetter")

    /* save to hdfs*/ 
 aggDF.write.format("parquet").mode("append").save("/raw/miscellaneous/ex_out_agg")

  }

    case class Record(id: Int
      , firstName: String
      , lastName: String
      , quantity:Int)

}

下面是单击应用程序后的屏幕截图

下面是查看id为0的特定"job“时显示的阶段

下面是单击包含200多个任务的阶段时屏幕的第一部分

这是舞台内屏幕的第二部分

下面是单击"executors“选项卡之后的内容

根据请求,以下是作业ID 1的阶段

以下是作业ID 1中包含200个任务的阶段的详细信息

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-11 04:26:42

这是一个经典的Spark问题。

用于读取(第二图中的阶段Id为0)的两个任务是defaultMinPartitions设置,该设置被设置为2。您可以通过读取REPL sc.defaultMinPartitions中的值来获取此参数。它也应该在Spark UI中的"Environment“选项卡下可见。

你可以看看来自GitHub的code,看看这到底是怎么回事。如果您希望在读取时使用更多分区,只需将其作为参数添加,例如,sc.textFile("a.txt", 20)

现在,有趣的部分来自第二个阶段上的200个分区(第二个图中的阶段Id 1)。好吧,每次有一次混洗,Spark需要决定混洗RDD将有多少分区。正如您可以想象的,默认值是200。

您可以使用以下命令进行更改:

代码语言:javascript
代码运行次数:0
复制
sqlContext.setConf("spark.sql.shuffle.partitions", "4)

如果您使用此配置运行代码,您将看到这200个分区将不再存在。如何设置这个参数是一门艺术。也许可以选择2倍于你拥有的内核数量(或者其他)。

我认为Spark 2.0有一种方法可以自动推断出混洗RDDs的最佳分区数量。期待这一天!

最后,您获得的作业数量与优化后的数据帧代码产生的RDD操作的数量有关。如果你读过Spark规范,它说每个RDD操作将触发一个作业。当您的操作涉及到Dataframe或SparkSQL时,Catalyst优化器将找出一个执行计划,并生成一些基于RDD的代码来执行它。很难说为什么它在你的例子中使用了两个动作。您可能需要查看优化的查询计划,以了解正在执行的操作。

票数 33
EN

Stack Overflow用户

发布于 2016-09-28 18:38:49

我也有类似的问题。但在我的场景中,我正在并行化的集合包含的元素比Spark调度的任务数量要少(导致spark有时行为异常)。使用强制分区号,我能够解决这个问题。

大概是这样的:

代码语言:javascript
代码运行次数:0
复制
collection = range(10) # In the real scenario it was a complex collection
sc.parallelize(collection).map(lambda e: e + 1) # also a more complex operation in the real scenario

然后,我在Spark日志中看到:

代码语言:javascript
代码运行次数:0
复制
INFO YarnClusterScheduler: Adding task set 0.0 with 512 tasks
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37758647

复制
相关文章
使用Crontab定时执行Spark任务【面试+工作】
第一个“#”表示是这一行是注释 第二个“!”表示这一行不是普通注释,而是解释器路径的声明行 后面的“/usr/bin/perl”是perl解释器的安装路径,也有可能是:“/usr/local/bin/perl”,如果那个不行,就换这个 use strict是严格检查语法
Java帮帮
2018/09/29
2.3K0
使用Crontab定时执行Spark任务【面试+工作】
Spark任务日志
SparkListenerLogStart SparkListenerBlockManagerAdded SparkListenerEnvironmentUpdate SparkListenerApplicationStart //N个 SparkListenerExecutorAdded //N个 SparkListenerBlockManagerAdded org.apache.spark.sql.execution.ui.SparkListenerSQLExecutionStart SparkListenerJobStart //N个 SparkListenerStageSubmitted //N个 SparkListenerTaskStart SparkListenerTaskEnd //N个
sparkle123
2021/01/13
4670
NLP任务中有哪些巧妙的idea?
链接:https://www.zhihu.com/question/356132676/answer/901244271
磐创AI
2019/11/26
6700
Spring Batch 在默认情况下的任务执行
考察项目:https://github.com/cwiki-us-spring/cwiki-us-spring-batch-examples 你可以 Check out 到本地后运行:
HoneyMoose
2020/02/24
1.2K0
Spring Batch 在默认情况下的任务执行
考察项目:https://github.com/cwiki-us-spring/cwiki-us-spring-batch-examples 你可以 Check out 到本地后运行:
HoneyMoose
2020/02/19
6580
Oozie分布式任务的工作流——Spark篇
Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark。在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任务,合理的设计工作流并分配适合的参数对于spark的稳定运行十分重要。 Spark Action 这个Action允许执行spark任务,需要用户指定job-tracker以及name-node。先看看语法规则: 语法规则 <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3
用户1154259
2018/01/17
1.3K0
Spark系列 - (4) Spark任务调度
Spark驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。Driver在Spark作业时主要负责:
码老思
2023/10/19
6451
Spark系列 - (4) Spark任务调度
[平台建设] Spark任务的诊断调优
平台目前大多数任务都是Spark任务,用户在提交Spark作业的时候都要进行的一步动作就是配置spark executor 个数、每个executor 的core 个数以及 executor 的内存大小等,这项配置目前基本靠用户个人经验,在这个过程中,有的用户就会设置非常不合理,比如配置的内存非常大,实际上任务运行时所占用的内存极少. 基于此,希望能有工具来针对任务进行分析,帮助用户来监控和调优任务,并给出一些建议,使任务更加有效率,同时减少乱配资源影响其他用户任务运行的情况。
awwewwbbb
2022/04/27
9240
[平台建设] Spark任务的诊断调优
获取任务的执行结果
之前的两篇文章中,我们介绍了异步编程,也介绍了线程池的基本概念。也说了,线程池的实现天生也实现了异步任务,允许直接向线程池中进行任务的提交与结果获取。
Single
2019/05/25
1.5K0
借助Spark Web UI排查Spark任务
一般比较关注YarnApplicationState 、Logs、ApplicationMaster。
liddytang
2023/10/11
1.3K0
Spark集群和任务执行
Driver:Spark框架中的驱动器,运行用户编写Application 的main()函数。类比于MapReduce的MRAppmaster
大数据学习与分享
2020/08/03
5920
Spark集群和任务执行
spark分区与任务切分
我们都知道在spark中,RDD是其基本的抽象数据集,其中每个RDD由多个Partition组成。在job的运行期间,参与运算的Parttion数据分布在多台机器中,进行并行计算,所以分区是计算大数据量的措施。
Tim在路上
2020/08/04
1.9K0
Spark集群和任务执行
Driver:Spark框架中的驱动器,运行用户编写Application 的main()函数。类比于MapReduce的MRAppmaster
大数据学习与分享
2020/08/10
3790
Spark集群和任务执行
【Spark篇】---Spark资源调度和任务调度
Spark的资源调度是个很重要的模块,只要搞懂原理,才能具体明白Spark是怎么执行的,所以尤其重要。
LhWorld哥陪你聊算法
2018/09/13
1.7K0
【Spark篇】---Spark资源调度和任务调度
查看Spark任务的详细信息
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序员欣宸
2019/10/22
2.9K0
查看Spark任务的详细信息
Spark任务调度 | Spark,从入门到精通
欢迎阅读美图数据技术团队的「Spark,从入门到精通」系列文章,本系列文章将由浅入深为大家介绍 Spark,从框架入门到底层架构的实现,相信总有一种姿势适合你,欢迎大家持续关注:)
美图数据技术团队
2019/04/19
6210
Spark任务调度 | Spark,从入门到精通
Spark任务调度 | Spark,从入门到精通
欢迎阅读美图数据技术团队的「Spark,从入门到精通」系列文章,本系列文章将由浅入深为大家介绍 Spark,从框架入门到底层架构的实现,相信总有一种姿势适合你,欢迎大家持续关注:)
美图数据技术团队
2018/09/18
1.4K0
Spark任务调度 | Spark,从入门到精通
Spark内核详解 (5) | Spark的任务调度机制
在上一篇博文中我们讲解了 Spark YARN-Cluster 模式下的任务提交流程,但是我们并没有具体说明 Driver 的工作流程, Driver 线程主要是初始化 SparkContext对象,准备运行所需的上下文,然后一方面保持与ApplicationMaster的RPC连接,通过ApplicationMaster申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。
不温卜火
2020/10/28
3.5K0
Spark内核详解 (5) | Spark的任务调度机制
Spark和MapReduce任务计算模型
【前言:本文主要从任务处理的运行模式为角度,分析Spark计算模型,希望帮助大家对Spark有一个更深入的了解。同时拿MapReduce和Spark计算模型做对比,强化对Spark和MapReduce理解】
大数据学习与分享
2020/08/10
5130
点击加载更多

相似问题

为什么我的spark流媒体工作中有这么多任务

30

为什么我的任务在Spark中成功完成?

12

为什么Spark中有这么多MapWithStateRDDs

10

为什么用任务终止任务会返回这么多错误?

112

为什么在开源社区中有这么多工具/技术来完成相同的任务

141
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文