场景:我被要求证明Apache Spark中的并行执行是真正的并行性而不是伪并行性(只是通过CPU快速切换任务)。我想出来证明这一点的方式是,如果我能证明,每个核心(我的机器中有8个核心)正在执行我创建的一个数据分区(创建与可用核心相同数量的分区)。如果我错了,请纠正我。
通过下面附带的代码,我能够访问日志中也可用的任务信息,以检查每个分区是否作为单独的任务执行。有没有人知道我如何访问处理器或核心信息来证明每个分区正由一个核心工作?有没有其他方法可以证明Apache Spark的并行性?
def getMap() = Map(
1 -> "uno",
4 -> "test",
5 -> "tiger",
6 -> "delete")
def getList() = List(
1 -> "one",
2 -> "two",
3 -> "three",
4 -> "four",
5 -> "five",
6 -> "six",
7 -> "seven",
8 -> "eight",
9 -> "nine",
10 -> "ten")
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Parallel Join").setMaster("local[8]")
val sc = new SparkContext(conf)
val t2 = sc.parallelize(getList(), 8)
val t1 = getMap()
val bt1 = sc.broadcast(t1)
t2.foreachPartition(p => {
val tc = TaskContext.get
val partId = tc.partitionId() + 1
val taskId = tc.taskAttemptId()
p.foreach(rec => {
val filteredValue = bt1.value.filterKeys(_.equals(rec._1))
val mappedFilterValue = filteredValue.map { case (k, v) => ("Key: " + k, " Values: " +(v, rec._2), " Task ID: " + taskId, " PartitionId: " + partId) }
mappedFilterValue.foreach(println)
})
})
}