我有一个错误,我的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
之后,任何给定的执行者是否有可能看不到与给定密钥相关的整个值?