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

RDD数据的并行化级别

殷建弼
2023-03-14

假设我有一个具有以下类型的 RDD:

RDD[(Long, List(Integer))]

我可以假设整个列表位于同一个工人吗?我想知道某些操作在RDD层面上是否可以接受,还是应该在车手层面计算。例如:

val data: RDD[(Long, List(Integer))] = someFunction() //creates list for each timeslot

请注意,该列表可能是汇总或任何其他操作的结果,不一定是作为一个整体创建的。

val diffFromMax = data.map(item => (item._1, findDiffFromMax(item._2)))

def findDiffFromMax(data: List[Integer]): List[Integer] = {
  val maxItem = data.max
  data.map(item => (maxItem - item))
}

问题是< code>List是分布式的,计算< code>maxItem可能会导致大量网络流量。这可以用以下类型的RDD来处理:

RDD[(Long, Integer /*Max Item*/,List(Integer))]

其中,最大项目是在驱动程序中计算的。

所以问题(实际上是两个问题)是:

  1. 在RDD数据的哪个点上,我可以假设数据位于一个工作人员处?(参考医生或个人评估的答案会很好)如果有的话?在元组内部的元组的情况下会发生什么:<code>((长,整数),Double)</code>
  2. 使用Tuples设计算法的常见做法是什么?我是否应该始终将数据视为可能出现在不同员工身上?我是否应该总是在第一个元组字段将其拆分为最小粒度-对于在时隙(Long)中存在用户(String)的数据(Double)的情况-数据应该是(Long,(Strong,Double,)或(Long、String)、Double或(String,Long,Double))?或者这不是最优的,矩阵更好

共有1个答案

子车安和
2023-03-14

简短的回答是肯定的,您的列表将位于单个工作人员中。

您的元组是RDD中的单个记录。单个记录始终在单个分区上(将在单个工作人员上)。当您执行findDiffFromMax时,您正在目标工作人员上运行它(因此该函数被序列化为要运行的所有工作人员)。

您应该注意的是,当您生成(k, v)的元组时,通常这意味着键值对,因此您可以在RDD上进行基于键的操作。顺序((Long,(强,双))vs.((Long, String),双)或任何其他方式)并不重要,因为它都是一条记录。唯一重要的是哪个键是执行键操作的键,所以问题是您计算的逻辑

 类似资料:
  • Narrow转换(映射、过滤器等)的SparkSQL数据帧是否有“spark.default.parallelism”等价物? 显然,RDD和DataFrame之间的分区控制是不同的。数据帧具有spark。sql。洗牌用于控制分区的分区(如果我理解正确的话,则为宽转换)和“spark.default.parallelism”将没有效果。 Spark数据帧洗牌如何影响分区 但洗牌与分区有什么关系呢?

  • 问题内容: 我在Java中使用spark,并且具有500万行的RDD。有没有一种解决方案可以让我计算RDD的行数。我已经尝试过,但是要花很多时间。我已经知道我可以使用该功能。但是我没有找到此功能的Java文档。您能否请教我如何使用它,或给我另一个解决方案以获取RDD的行数。 这是我的代码: 谢谢。 问题答案: 您有一个正确的想法:用于计算行数。没有更快的方法。 我认为您应该问的问题是 为什么这么慢

  • 我正试图用大约8000个观察值和一个4个3/2协方差函数的复合内核在2D空间1D时间上运行一个GP回归——这超过了一个内核的处理能力。 如果能够将 GPR 计算分布在多个节点上,而不必求助于变分 GP,那就太好了。这个github问题解释了如何在GPflow 1.0中执行多线程处理,但我并不是在寻找一种并行化许多调用的方法。 相反,我想在大型数据集上进行GPR,这意味着反转大于单个核心可以处理的协

  • 本文向大家介绍Pyspark获取并处理RDD数据代码实例,包括了Pyspark获取并处理RDD数据代码实例的使用技巧和注意事项,需要的朋友参考一下 弹性分布式数据集(RDD)是一组不可变的JVM对象的分布集,可以用于执行高速运算,它是Apache Spark的核心。 在pyspark中获取和处理RDD数据集的方法如下: 1. 首先是导入库和环境配置(本测试在linux的pycharm上完成) 2.

  • Spark通过在操作中将其持久保存在内存中,提供了一种处理数据集的便捷方式。在持久化RDD的同时,每个节点都存储它在内存中计算的任何分区。也可以在该数据集的其他任务中重用它们。 我们可以使用或方法来标记要保留的RDD。Spark的缓存是容错的。在任何情况下,如果RDD的分区丢失,它将使用最初创建它的转换自动重新计算。 存在可用于存储持久RDD的不同存储级别。通过将对象(Scala,Java,Pyt

  • Spark 有一个最重要的功能是在内存中_持久化_ (或 缓存)一个数据集。