前言
当一个函数传递给spark集群去运行的时候(map,reduce)。该函数的所有变量都会在各个节点的任务中创建一个副本,当该变量数据计较大的手,会极大的占用计算机宝贵的内存资源。并且各个节点的变量是相互隔离的,变量的更新也不会传入到driver中。针对于此,spark提供了两种类型的共享变量,广播变量和累加器。
闭包
跨作用域访问函数量变。深度解释,在spark集群中,如果在main函数也就是driver中定义了变量,使用foreach或者map等函数使用该变量的时候,会在每个节点任务中创建该变量的副本,并且对于副本的操作更新相互隔离的,也就是说每个节点对于变量的更新操作都不会影响driver中的变量值,这样就是闭包,闭包会导致数据操作异常。
广播变量
使用广播变量可以是变量在每个节点上缓存一个副本而不是各个任务中
sparkcontext.broadcast(Array(1,2,3))
累加器
使用累加器可以方便的在集群中统计数量,一般使用+=进行自增,我们也可以使用自定义的累计器,继承AccumulatorParam
val c = sparkcontext.accumulator(0,"a")
c+=1
网友评论