![](/img/trans.png)
[英]How to determine number of partitons of rdd in spark given the number of cores and executors ?
[英]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.