当前位置: 首页 > 知识库问答 >
问题:

在Apache Spark中混合与非混合合并

东门城
2023-03-14

当以下转换在将RDD写入文件之前执行时,它们之间有什么区别?

  1. 聚结(1,洗牌=true)
  2. 合并(1,洗牌=假)

代码示例:

val input = sc.textFile(inputFile)
val filtered = input.filter(doSomeFiltering)
val mapped = filtered.map(doSomeMapping)

mapped.coalesce(1, shuffle = true).saveAsTextFile(outputFile)
vs
mapped.coalesce(1, shuffle = false).saveAsTextFile(outputFile)

它与collect()相比如何?我完全知道Spark save方法将以HDFS风格的结构存储它,但我更感兴趣的是collect()和shuffled/non shuffled coalesce()的数据分区方面。

共有3个答案

山鸿彩
2023-03-14

coalesce(n, schffle=true)也相当于re分区(n)可能会对作业的执行产生相当大的影响,这取决于父RDD中的映射或任何其他处理登录。

一般来说,如果父分区中的数据分布均匀,并且没有大幅减少分区数,那么在使用coalesce时应该避免使用shuffle。

然而,在您的情况下,这是分区数量的大幅减少,并且符合文档要求

但是,如果您正在进行剧烈合并,例如to numPartitions=1,这可能会导致您的计算发生在比您希望的更少的节点上(例如,numPartitions=1的情况下是一个节点)。为了避免这种情况,可以传递shuffle=true。这将添加一个洗牌步骤,但意味着当前的上游分区将并行执行(无论当前分区是什么)

考虑到这一点,现在你需要正确地评估和选择

  • 洗牌潜在的大量数据,但在父分区中并行进行计算

例如,考虑以下片段,这些片段与你可能拥有的实际逻辑相去甚远,但会给你一个正在发生的事情的视角

// fast
sc.parallelize(0 to 1000000, 10)
  .mapPartitions(it => {Thread.sleep(5000); it.map(_.toString)})
  .coalesce(1, shuffle = true)
  .toDF.write.text("shuffleTrue")
// slow
sc.parallelize(0 to 1000000, 10)
  .mapPartitions(it => {Thread.sleep(5000); it.map(_.toString)})
  .coalesce(1, shuffle = false)
  .toDF.write.text("shuffleFalse")

在我的集群上,使用shuffle=true显示10个任务的总时间约为5秒,在每个父分区上并行执行计算逻辑。而另一个使用shuffle=false的执行器在一个任务中,大约有50秒的时间在一个执行器上完成所有计算。

谭俊
2023-03-14

通过查看Spark 2.3.1的合并文档,https://spark.apache.org/docs/2.3.1/api/java/org/apache/spark/rdd/RDD.html#coalesce-int布尔scala。选择scala。数学订购-

当您将分区数量减少到1以避免计算发生在比您喜欢的更少的节点上时,添加Shuffle=true看起来更方便。这将增加一个洗牌步骤,但意味着当前上游分区将并行执行。

轩辕鸿
2023-03-14

Shuffle=true和Shuffle=false在结果输出中不会有任何实际差异,因为它们都将下降到单个分区。然而,当您将其设置为true时,您将执行没有任何用处的洗牌。使用Shuffle=true,输出在分区之间均匀分布(如果你愿意,你也可以增加分区的#),但是因为你的目标是1个分区,所以不管怎样,一切都结束在一个分区中。

至于与collect()的比较,区别在于所有数据都存储在单个执行器上,而不是存储在驱动程序上。

 类似资料:
  • OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多

  • 问题内容: 在Java中,这样做并使用相同的锁定机制? 我的猜测是“不”,但我希望是错的。 例: 想象一下,线程1和线程2都可以访问: 线程1运行: 线程2运行: 假设线程1首先到达其部分,然后在线程1完成之前到达线程2:线程2将等待线程1离开该块,还是继续运行? 问题答案: 不,即使线程1 在同一线程上,线程2也可以。这是文档必须说的: 请注意,Lock实例只是普通对象,它们本身可以用作同步语句

  • 我希望将后端公开为“资源”(如Restlet),并消除服务层,以便Rest资源可以直接与Dao交互。这样,资源就是契约,而不是接口。 如果事务由Spring本地管理,在Spring MVC 3控制器上使用@Transactional语义学是否有问题?回滚和捕捉异常有什么问题吗?

  • 混合(Mixins)提供一种方法来组合和重用常用组件属性集。它们使用<a-mixin>元素来定义并被放置在 <a-assets>中。Mixins必须有一个id,并且当一个实体把id设置为其mixin属性时,该实体将吸收这个mixin的所有属性。 <a-scene> <a-assets> <a-mixin material="color: red"></a-mixin> <a-mixi

  • 混合宏是整个 Sass 语言中最常用的功能之一。这是重用和减少重复组件的关键。这么做有很棒的原因:混合宏允许开发者在样式表中定义可复用样式,减少了对非语义类的需求,比如.float-left。 它们可以包含所有的 CSS 规则,并且在 Sass 文档允许的任何地方都表现良好。它们甚至可以像函数一样接受参数。不用多说,充满了无尽的可能。 不过我有必要提醒你滥用混合宏的破坏力量。再次重申一遍,使用混合

  • 如果你的整个网站中有几处小小的样式类似(例如一致的颜色和字体),那么使用变量来统一处理这种情况是非常不错的选择。但是当你的样式变得越来越复杂,你需要大段大段的重用样式的代码,独立的变量就没办法应付这种情况了。你可以通过sass的混合器实现大段样式的重用。 混合器使用@mixin标识符定义。看上去很像其他的CSS @标识符,比如说@media或者@font-face。这个标识符给一大段样式赋予一个名