繁体   English   中英

Spark:具有不同内核数量的不同输出

[英]Spark: Different output with different number of cores

当我更改Spark应用程序中的核心数时,我正在处理一个奇怪的行为,这是代码:

import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkContext, SparkConf}
object Test extends App {
Logger.getLogger("org").setLevel(Level.WARN)
var listLink: List[String] = List()
def addListLink(s: String) = {
val list = s.split(",")
for (i <- 0 to list.length - 2) {
  listLink = list(i)+ "-" + list(i + 1) :: listLink
 }
}
val conf = new SparkConf().setMaster("local[1]").setAppName("Simple Application")
val sc = new SparkContext(conf)
val paths = sc.textFile("file:///tmp/percorsi.txt")
paths.foreach(x => addListLink(x))
println("Number of items:"+listLink.size)
println(listLink)
}

我的输入文件是这样的:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C
A,B,C
A,B,C
A,B,C
A,B,C
B,C,D
B,C,D
B,C,D
B,C,D
C,D
C,D

基本上对于每个路径,我调用我的方法,该方法向List添加一个元素,表示每个连续的元素:

例如:“A,B,C,D”=>(“AB”,“BC”,“CD”)

如您所见,在代码中只有一个核心

.setMaster("local[1]")

如果我运行我的应用程序(本地或群集),我会得到我期望的

println("Number of items:"+listLink.size)
//Result --> Number of Items : 38

如果我将核心数量更改为3(例如),我会得到不同的值。 例如33项而不是38项。

我错过了关于核心数量或其他内容(分区,ecc ......)的内容吗?

我认为这是一个非常简单的应用程序,但无论如何我都会遇到这种奇怪的行为。

谁能帮助我?

提前致谢

FF

每个分区都有一个单独的listLink 因此,您要将项目添加到多个列表中,最后只打印一个。

通常,当在远程集群节点上执行传递给Spark操作(例如map或reduce)的函数时,它将在函数中使用的所有变量的单独副本上工作。 这些变量将复制到每台计算机,并且远程计算机上的变量的更新不会传播回驱动程序。

(从这里https://spark.apache.org/docs/latest/programming-guide.html#shared-variables

这是你的幸运日:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import scala.collection.mutable.ArrayBuffer


val data = List(
"A,B,C,D",
"A,B,C,D",
"A,B,C,D",
"A,B,C,D",
"A,B,C,D",
"A,B,C,D",
"A,B,C",
"A,B,C",
"A,B,C",
"A,B,C",
"A,B,C",
"B,C,D",
"B,C,D",
"B,C,D",
"B,C,D",
"C,D",
"C,D")

val conf = new SparkConf().setAppName("spark-scratch").setMaster("local")
val sc= new SparkContext(conf)


val dataRDD = sc.makeRDD(data, 1)
val linkRDD = dataRDD.flatMap(_.split(",").sliding(2).map{_.mkString("", "-", "")})

linkRDD.foreach(println)

输出:

A-B
B-C
C-D
A-B
B-C
C-D
A-B
B-C
C-D
A-B
B-C
C-D
A-B
B-C
C-D
A-B
B-C
C-D
A-B
B-C
A-B
B-C
A-B
B-C
A-B
B-C
A-B
B-C
B-C
C-D
B-C
C-D
B-C
C-D
B-C
C-D
C-D
C-D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM