RDD.groupByKey不提供不同的密钥集

时间:2018-02-14 03:01:26

标签: apache-spark rdd amazon-emr

我有一个错误,我的spark作业的输出(提交给Amazon EMR)表明缺少输入数据的块。

数据处理发生在执行程序的外部进程中。此过程需要存在给定键的所有输入,并且在事后不能连接。

当我检查日志记录时,我可以看到RDD.groupByKey未能将该密钥下的密钥的所有值分组到同一个执行程序中。

case class TileKey(z: Short, x: Int, y: Int)
case class ProcessResult(code: Int, message: String)

def exec(tk: TileKey, xs: Seq[String]): ProcessResult = {
  // a function that uses sys.process to call the executable on the executor,
  // passing `xs` to it and returning some kind of execution result
  ...
  ProcessResult(code = 0, message = s"Processing ${xs.size} entries for $tk")
}

val input: RDD[(TileKey, String)] = ???

input.groupByKey().map {
  case (k, xs) => exec(k, xs.toSeq)
}.map(_.message).collect().foreach(println)

日志记录显示

Processing 15441 entries for TileKey(12,702,1635)
...
Processing 1 entries for TileKey(12,702,1635)

表示groupByKey之后存在重复的密钥条目。第二批处理将覆盖第一批处理的输出。

groupByKey之后,任何给定的执行者是否有可能看不到与给定密钥相关的整个值?

0 个答案:

没有答案