SPARK驱动程序与工人代码执行澄清

时间:2018-04-21 10:00:10

标签: apache-spark

我已经阅读了很多关于不使用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程序,显然没有这样的问题,但这是一个不同的平台。

0 个答案:

没有答案