【发布时间】:2018-03-26 15:01:22
【问题描述】:
我在循环中使用广播变量,如下所示(为了简短起见,我用一种伪代码来展示它,而不是 Java 中的确切语法):
Broadcast<List<E>> brdList = jsc.broadcast(myVariable);
JavaRDD<myType> rdd = rawRdd.map(f(brdList.value()));
List<E> updatedBrdList = rdd.map(g).collect();
brdList.unpersist();
int itr = 1000;
while (itr != 0){
Broadcast<List<E>> brdNewList(updatedBrdList);
rdd = rdd.map(f(brdNewList.value()));
updatedBrdList = rdd.map(g).collect();
itr--;
}
这种用法是使用广播变量的有效形式吗? brdNewList 是在内存中占用一个位置还是在每次迭代中都占用了新空间并创建了一个新副本?
迭代次数很少(~ the error with using broadcast variable in Spark
有什么办法可以绕过它并让它工作吗?广播变量的值必须在每次迭代中通过所有节点访问。
这与驱动程序内存有关吗?或者执行者(工人)中有一些计算? (我在一个有 5 个节点的集群上运行我的代码。)
感谢任何帮助!
【问题讨论】: