Tupled RDD数据的并行化级别

时间:2017-01-02 07:38:57

标签: scala apache-spark

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

RDD[(Long, List(Integer))]

我可以假设整个列表位于同一个工作人员处吗?我想知道某些操作在RDD级别上是否可接受,或者是否应在驱动程序中计算。例如:

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

请注意,List可能是aggregate或任何其他操作的结果,不一定是一件作品。

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))
}

问题是List分布式计算maxItem可能会导致大量网络流量。这可以是具有以下类型的RDD的句柄:

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

最大项目是在司机处计算的。

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

  1. 在RDD数据的哪一点,我可以假设数据位于一个工作人员? (如果有的话,参考文件或个人评估的答案会很棒)?在Tuple里面的元组中发生了什么:((Long, Integer), Double)
  2. 使用元组设计算法的常见做法是什么?我是否应始终将数据视为可能出现在不同的工作人员身上?我应该总是在第一个元组字段中将其分解为最小粒度 - 对于用户(字符串)在时间段(长)中存在数据(双)的情况 - 数据应该是(长,(强,双))还是((Long,String),Double)或者(String,(Long,Double))?或者这可能不是最优的,矩阵更好?

1 个答案:

答案 0 :(得分:3)

简短的回答是肯定的,你的名单将位于一名工人身上。

您的元组是RDD中的单个记录。单个记录总是在单个分区上(可以在单个工作者上)。 当你执行findDiffFromMax时,你在目标worker上运行它(因此该函数被序列化为所有要运行的worker)。

你应该注意的是,当你生成一个(k,v)元组时,这意味着一个键值对,这样你就可以对RDD进行基于键的操作了。顺序((长,(强,双))与((长,字符串),双)或任何其他方式)并不重要,因为它只是一条记录。唯一重要的是哪个是关键操作的关键,所以问题就是计算的逻辑