Apache spark Spark花费了太多时间,为某些任务创造了数千个工作岗位

Apache spark Spark花费了太多时间,为某些任务创造了数千个工作岗位,apache-spark,cassandra,apache-spark-sql,Apache Spark,Cassandra,Apache Spark Sql,机器配置: 内存:16 gb 处理器:4核(Xeon E3 3.3 GHz) 问题: 耗时:耗时超过18分钟 案例场景: 火花模式:本地 数据库:使用Cassandra 2.1.12 我正在将3个表提取到数据帧中,数据帧的行数少于10行。是的,少于10(十)。 在将其提取到数据帧中之后,我多次执行联接、计数、显示和收集操作。当我执行我的程序时,Spark 4次创建40404个作业。它表示count需要执行这些作业。我在程序中使用计数4-5次。在等待超过18分钟(大约18.5到20

机器配置:

  • 内存:16 gb
  • 处理器:4核(Xeon E3 3.3 GHz)
问题:

  • 耗时:耗时超过18分钟
案例场景:

  • 火花模式:本地

  • 数据库:使用Cassandra 2.1.12

我正在将3个表提取到数据帧中,数据帧的行数少于10行。是的,少于10(十)。 在将其提取到数据帧中之后,我多次执行联接、计数、显示和收集操作。当我执行我的程序时,Spark 4次创建40404个作业。它表示count需要执行这些作业。我在程序中使用计数4-5次。在等待超过18分钟(大约18.5到20分钟)后,它会给我预期的输出

  • 为什么Spark创造了那么多的就业机会
  • 执行此数量的作业(大约40404*4个)需要花费这么多时间(18分钟)是否明显(“正常”)
提前谢谢

示例代码1:

def getGroups(id:Array[String],level:Int):数据帧={
var lvl=水平
如果(级别>=0){
for(迭代的_id row.getString(0)}
中间值=空值
//println(“新方法…如果部分…”)
getGroups(用户id参数,lvl)
}否则{
//println(“新方法…”)
最后的_df.distinct()
}
}
示例代码2:

setGetGroupsVars(“u_id”,user_id.toString(),sa_user_df)
var用户\u属于\u组:数据帧=空\u df
val user_array=array[String](user_id.toString())
val user_levels=sa_user_df.filter(“id=”+“user_id+”))。选择(“level”).distinct().collect().map{x=>x.getInt(0)}
println(用户级别.长度+“…rapak”)
println(用户\u id.toString())
对于(u_lvl x.getInt(0)}
println(对象级别长度)

对于(ob_lvl好的,让我们记住一些基础知识

Spark是一个懒惰的动作,
show
count
是动作

一个动作会触发转换,而你有大量的转换。如果你正在汇集来自Cassandra(或任何其他来源)的数据,这会花费很多,因为你似乎没有缓存你的转换

这样,当您在数据文件或RDD上集中计算时,需要考虑缓存,这将使您的操作更快地执行! 关于为什么有这么多任务(作业)的原因,当然可以通过spark并行机制来解释,执行的操作数乘以正在执行的转换/操作数,更不用说循环了

尽管如此,根据问题中给出的信息和发布的代码片段的质量,我的回答就到此为止

我希望这有帮助!

  • 首先,您可以在GUI中检查程序的哪个阶段需要很长时间
  • 第二,您多次使用
    distinct()
    ,因此在使用
    distinct()
    时,您必须查看distinct()之后有多少个分区。我认为这就是spark创建数千个工作的原因
  • 如果这是您可以在
    distinct()
    之后使用
    coalesce()
    的原因

可能的答案太多,或者好的答案对于这种格式来说太长。请添加详细信息以缩小答案集,或者隔离可以在几段中回答的问题。ok@eliasah..还有什么事情需要更具体的…请你建议…指定数据的代码和结构。请提供你的代码,甚至更好,是您代码中最需要计算的部分。我添加了代码示例。@sumit&GameofThrows。我认为不需要数据结构。但我仍然使用3个表,少于10行,表大约有10列。我不使用DB查询处理任何数据。我先创建Dataframe,然后创建应用程序使用连接、收集、筛选、计数、显示等来获得所需的结果。我使用了.cache(),但影响不大。它有时会减少我的时间,比如30秒。它也不会减少作业的数量。在我的程序中,几乎没有地方可以使用它们,因为我大部分都有var(而不是val),所以我认为使用.cache()是没有意义的好了。不幸的是,你的代码太大了,我只能给你提供这些信息。谢谢@karmadip..你是对的..distinct一次创建200个分区,然后当我执行join 40000时(200*200,因为我在两个数据帧上执行join,具有distinct方法和延迟加载特性)任务是在单个作业中创建的。您对coalesce()的解决方案是有效的,现在我的程序工作正常。但对我来说,为什么使用distinct()仍然是个谜在我的dataframe只有大约10行的情况下,正在创建那么多的分区。?spark中有许多用于性能调整的配置选项,您可以根据需要进行设置。其中一个是“spark.sql.shuffle.partitions”,默认值是200。这可能是您获得200个参与的原因。