美文网首页
理解闭包

理解闭包

作者: pcqlegend | 来源:发表于2018-04-04 23:35 被阅读0次

spark 比较难得一个事情之一就是当在集群上执行代码的时候,变量和方法的范围和生命周期。Rdds 的操作 能够修改他们外部的变量这是一个持续混淆的原因。在下面的例子中,我们来看下使用foreach 方法来增加计数器代码,当然其他的一些操作也有类似的问题。
Example
思考如下一个简单的RDD元素的求和的问题,这个问题会根据你的执行是否在同一个JVM内而不同。一个常见的例子就是 运行spark在 local 模式的话(--master = local)和在一个集群上运行一个Spark的应用(比如 通过spark-submit 提交到YARN)

var counter = 0
var rdd = sc.parallelize(data)

// Wrong: Don't do this!!
rdd.foreach(x => counter += x)

println("Counter value: " + counter)

Local vs. cluster 模式
以上代码的行为是不确定的,而且可能执行起来和你想的不同。为了执行job,Spark 将Rdd的操作切分成很多task。这些task 是被每一个executor执行的。在执行前,Spark会计算task的闭包。闭包就是那些对于executor可见的并且可以再RDD上进行计算的变量和方法。闭包是可以序列化并且被发送到每一个excutor上的。
被发送到executor上的闭包内的变量是拷贝的,因而,当couner 在 foreach 内的被引用的时候,它已经不是driver 节点上的counter了。 driver 节点上的counter 依然存在于内存中,但是已经对于executors 不可见了。这些executors 只能看到来自序列化的闭包的副本。因而,最终 counter的值将会一直是0,因为所有counter的操作都是引用的闭包内的值。
为了保证这些场景下 明确的行为,应该使用一个 Accumulator.

相关文章

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解。 什么是闭包? 引用高程里...

  • 闭包理解

    这次我发现了个奇怪的问题,高程经典的闭包陷阱,竟然是把一个未执行的函数赋值给了一个数组项,当年的我太年轻,竟然没看...

  • 理解闭包

    什么是「闭包」。 「闭包」的作用是什么。在一个立即执行函数当中: 首先,假设以上几行代码运行在立即执行函数当中,那...

  • 理解闭包

    什么是闭包?闭包是什么时候创建的?能不能看到闭包?从这三点出发学习。 在维基百科中的闭包:词法闭包的简称。是引用了...

  • 理解闭包

    spark 比较难得一个事情之一就是当在集群上执行代码的时候,变量和方法的范围和生命周期。Rdds 的操作 能够修...

  • 理解闭包

    欢迎移步我的博客阅读:《理解闭包》 闭包 是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码...

  • 理解闭包

    理解闭包 1.闭包概念(出自JavaScript高级程序设计)闭包是指有权访问另一个函数作用域中的变量的函数主谓宾...

  • 理解闭包

    理解闭包 红宝书是这样定义闭包的:是指有权访问 另一个函数作用域中的变量 的 函数。所以闭包首先是一个函数,特殊的...

网友评论

      本文标题:理解闭包

      本文链接:https://www.haomeiwen.com/subject/elxtwxtx.html