广播变量
为什么会用广播变量?
- 本地list对象被发送到每个分区的处理线程上使用,也就是一个executor内,其实存放了两份一样的数据,executor是进程,进程内资源共享,这两份数据没有必要,造成内存资源浪费。
- 如果将本地list对象标记为广播变量对象,那么当出现上述情况下,spark就会给每个executor来一份数据,而不是像原本那样,每个分区的处理线程都来一份,节省内存
- 使用广播变量后,每个executor只会收到一份数据集,内部的各个线程(分区)共享这一份数据集
使用方法
broadcast = sc.broadcast(list)
value = broadcast.value
累加器
为什么使用累加器?
- 当count来自driver对象,executor中的map算子需要count对象时,driver会将count对象复制发送给每个executor,所以不管executor中累加到多少,都和driver这个count无关,这时就需要使用累加器实现全局变量定义。
使用方法
sc.accumulator(初始值)
注意事项
- 使用累加器的时候,要注意,因为rdd是过程数据,如果rdd被多次使用,可能会重新构建rdd。如果累加器代码在重新构建的步骤中,累加器累加代码就会被执行多次
- 解决方法:将rdd加入缓存或者CheckPoint即可