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

Spark:处理collect()、groupByKey()、reduceByKey()等性能密集型命令

唐麒
2023-03-14

我知道一些Spark操作(如Collection())会导致性能问题。

已在文件中引用

要打印驱动程序上的所有元素,可以使用collect()方法首先将RDD带到驱动程序节点,因此:<代码>RDD。collect()。foreach(println)。但这可能会导致驱动程序内存不足,

因为collect()将整个RDD提取到一台机器上;如果只需要打印RDD的几个元素,更安全的方法是使用RDD。以(100)为例。foreach(println)。

还有一个相关的SE问题:按键分组时,Spark会运行内存溢出

我已经知道,如果并行度设置不正确,那么groupByKey()、reduceByKey()可能会导致内存不足。

我没有得到关于其他转换和动作命令的足够证据,必须谨慎使用。

这三条是唯一需要处理的命令?我对以下命令也有疑问

  1. aggregateByKey()
  2. sortByKey()
  3. persist()/cache()

如果您提供关于密集型命令(跨分区全局命令,而不是单分区或低性能命令)的信息,那就太好了,必须通过更好的保护来解决这些问题。

共有1个答案

东方新霁
2023-03-14

您必须考虑三种类型的操作:

  • 仅使用map分区(SusIndex)实现的转换,例如过滤器map平面图等。通常它将是最安全的组。您可能遇到的最大问题是大量溢出到磁盘。
  • 需要洗牌的
  • 转换。它包括明显的嫌疑人,例如组合ByKey的不同变体(groupByKey还原ByKey聚合ByKey)或加入,以及不太明显的sortBy不同的重新分区。没有上下文(数据分布、还原的确切功能、分区器、资源)很难判断特定的转换是否会有问题。有两个主要因素:
    • 流量和磁盘IO-任何未在内存中执行的操作都将至少慢一个数量级。
    • 偏斜的数据分布-如果分布高度偏斜,洗牌可能会失败,或者后续操作可能会受到次优资源分配的影响

    需要向驱动程序传递数据和从驱动程序传递数据的操作。通常,它包括收集或获取等操作,以及从本地数据结构创建分布式数据结构(并行化)。

    此类别的其他成员包括广播(包括自动广播连接)和累加器。总成本当然取决于特定操作和数据量。

    虽然其中一些操作可能很昂贵,但没有一个是特别糟糕的(包括妖魔化的groupByKey)。显然,最好避免流量或额外的磁盘IO,但实际上在任何复杂的应用程序中都无法避免它。

    关于缓存,您可能会发现Spark:为什么我必须明确告诉缓存什么?有用的

 类似资料:
  • 你好,我经常需要在代码中使用,但我知道这是一个非常繁重的操作。由于我正在努力提高性能,我想知道删除所有调用的方法是否有效。 我使用的是,但是由于这种方法对于大型数据集可能会有很大的问题,所以我想使用这个解决方案: 我所做的不是创建类型对(Int,Int)的RDD,而是创建类型对(Int,list[Int]),所以我的如下所示 你认为有没有更快的方法来达到同样的结果,使用一些其他的方法?谢谢你。

  • 这是这里的后续问题。我正试图在这个实现的基础上实现k-means。它工作得很好,但我想用替换,但我不确定如何替换(我现在不担心性能)。以下是相关的简化代码: 请注意,将给出: 地图(23)- 和: 在地图kmeans.scala:75 相关问题:在ApacheSpark(Scala)中使用reduceByKey。 一些文件: DEF还原ByKey(func:(V, V)0020 V): RDD[(

  • 我使用的是Spark 1.5/1.6,我想在DataFrame中执行reduceByKey操作,我不想将df转换为rdd。 每行看起来像,我有多行id1。 我想有这样的东西: 所以,对于每个“id1”,我希望所有记录都列在一个列表中 顺便说一句,我不想将df转换为rdd的原因是,我必须将这个(减少的)数据帧连接到另一个数据帧,并且我正在对连接键进行重新分区,这使得它更快,我想rdd也不能这样做 任

  • 主要内容:groupByKey函数的示例在Spark中,函数是一种经常使用的转换操作,它执行数据的混乱。它接收键值对(K,V)作为输入,基于键对值进行分组,并生成(K,Iterable)对的数据集作为输出。 groupByKey函数的示例 在此示例中,根据键对值进行分组。要在Scala模式下打开Spark,请按照以下命令操作。 使用并行化集合创建RDD。 现在,可以使用以下命令读取生成的结果。 应用函数对值进行分组。 现在,可以使用以下

  • 我正在努力学习Spark,到目前为止进展顺利,除了我需要在值为列表的一对RDD上使用诸如还原ByKey或组合ByKey之类的函数的问题。 我一直试图为这些函数找到详细的留档,这可以解释参数实际上是什么,这样我就可以自己解决它,而不必去Stack Overflow,但我就是找不到任何好的Spark留档。我读过Learning Spark的第3章和第4章,但老实说,对最复杂函数的解释非常糟糕。 我现在

  • 问题内容: 我正在尝试使用java作为编程语言来了解Spark中的工作。 说我有一句话“我就是我”。我把句子分解成单词并将其存储为列表。 现在,此函数将分配给每个单词: 所以输出是这样的: 现在,如果我有3个reducer运行,则每个reducer将获得一个键和与该键关联的值: 我想知道 一个。在下面的函数中到底发生了什么。 b。参数是什么 c。基本上,JavaPairRDD是如何形成的。 问题答