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

时间:2015-05-21 15:20:55

标签: scala parallel-processing apache-spark cpu-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添加一个元素,代表每个连续的元素:

例子:&#34; A,B,C,D&#34; =&GT; (&#34; A-B&#34;&#34; B-C&#34;&#34; C-d&#34)

正如您所看到的,在代码中只有一个核心

.setMaster("local[1]")

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

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

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

我是否遗漏了有关核心数量或其他内容(分区,ecc ......)的内容?

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

有人可以帮助我吗?

提前致谢

FF

1 个答案:

答案 0 :(得分:3)

每个分区都有一个单独的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