最大的可能优势是共享内存,特别是处理广播对象。因为这些对象被认为是只读的,所以可以在多个线程之间共享。
在使用单个任务/执行器的场景中,您需要为每个JVM提供一个副本,因此对于N个任务有N个副本。对于大型对象,这可能是一个严重的开销。
相同的逻辑可以应用于其他共享对象。
正如已经说过的,广播变量是一回事。
另一个是并发问题。看看这段代码:
var counter = 0
var rdd = sc.parallelize(data)
rdd.foreach(x => counter += x)
println(counter)
结果可能会有所不同,取决于是在本地执行还是在部署在集群上的Spark(使用不同的JVM)上执行。在后一种情况下,并行化
方法在执行器之间拆分计算。闭包(每个节点执行任务所需的环境)是计算的,这意味着每个执行器都会收到计数器
的副本。每个执行器都会看到自己的变量副本,因此计算的结果为0,因为没有一个执行器引用了正确的对象。另一方面,在一个JVM中,计数器
对每个工作人员都是可见的。
当然,有一种方法可以避免这种情况-使用Acumulator
s(请参阅此处)。
最后但同样重要的是,当在内存中持久化RDD
s时(默认的缓存
方法存储级别是MEMORY_ONLY
),它将在单个JVM中可见。这也可以通过使用OFF_HEAP
来克服(这在2.4.0中是实验性的)。更多信息。
我的查询如下: > 在我的应用程序中,我需要在计划中同时运行多个pyspark应用程序。是否有任何方法可以同时从spark驱动程序运行多个pyspark应用程序,从而创建单独的sparkcontext对象? 如果第一个查询的答案是否定的,那么我可以运行一个应用程序从驱动程序,另一个从执行程序,但我可以一次运行它。 null 配置:VM-1:Hadoop主节点、Spark驱动程序和执行程序、Mong
我有一个spark作业,它从数据库中读取数据,执行过滤、联合、2连接,最后将结果写回数据库。 然而,最后一个阶段仅在50个执行器中的一个执行器上运行一个任务。我试图增加分区的数量,使用哈希分区,但没有成功。 经过几个小时的谷歌搜索,似乎我的数据可能会但我不知道如何解决它。 有什么建议吗? 规格: < li >独立群集 < li>120核心 < li>400G内存 遗嘱 执行 人: 30个执行器(4
本文向大家介绍现在有一个宏任务,又有一个微任务两者同一层级,在微任务里面又有一个宏任务和一个微任务,请问执行顺序是什么,为什么?相关面试题,主要包含被问及现在有一个宏任务,又有一个微任务两者同一层级,在微任务里面又有一个宏任务和一个微任务,请问执行顺序是什么,为什么?时的应答技巧和注意事项,需要的朋友参考一下 宏任务——》微任务中的宏任务——》微任务中的微任务——》微任务 宏任务执行完成会去检测微
我有一个旧式代码计时器,每2秒运行一次长时间的数据库更新查询,类似这样 假设我们不需要DB更新结果,那么在上面的代码中不等待任务完成会有什么影响吗? 在我的理解中,当我们称之为任务时。Run()从线程池中获取新的/可用的线程,任务在此线程中运行。因为我们称之为任务。从sync方法运行()时,我们不会记住当前的同步上下文,并在任务完成时恢复它,就像等待任务一样。在异步方法中运行()。因此,我的另一个
问题内容: 如何在一台机器上运行多个JVM?您如何在其他JVM中调用方法? 问题答案: 如何在一台机器上运行多个JVM? 只需启动多个进程即可。 您如何在其他JVM中调用方法? 使用任何类型的RPC框架(RMI,EJB,Web服务等)。
问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并