我已经阅读了很多关于不使用SPARK中的计数器但是累加器的东西。 另一方面,SPARK支持比MR更多的执行模式。
我们在下面看到这不是一个好方法。理解,而不是我的问题。
// Only works in local, not across cluster
var counter = 0
val data = Array(1,2,3,4,5,6,7,8,9,10)
var rdd = sc.parallelize(data)
// Wrong: Don't do this!!
rdd.foreach(x => counter += x)
println("Counter value: " + counter)Understood.
但是,以下我已经看到并且实际上想要遵循 - 一些特定于某些用例的迭代过程。以下是我在论坛上发现的一个片段:
var myRDD: RDD[Double] = initialRDD
var counter = 0
do
{
val output = myFunction(myRDD)
myRDD = output._2 // output._2 is the transformed/derived RDD
if (counter == 25) // 25 is a somewhat arbitrary threshold for when to checkpoint
{
myRDD.checkpoint()
val n = myRDD.counter() // force evaluation immediately
counter = 0
}
counter = counter + 1
} while (!finished)
所以,上面不是我的编码,只是为了证明一个相关的观点。
具体来说,我认为这个全局计数器和全局计数器作为驱动程序的一部分运行,并且在集群模式下运行时不会对worker执行。还是我非常错?
计数器和while与数据/工作节点无关是我的看法,所以我应该能够在集群上进行这样的编程。
有冒险的风险 - 我在这里寻求清晰。我用JDBC连接编写SCALA程序,显然没有这样的问题,但这是一个不同的平台。