我很好奇以下简单代码是否可以在分布式环境中运行(它在独立环境中是否可以正常工作)?
public class TestClass {
private static double[][] testArray = new double[4][];
public static void main(String[] args) {
for(int i = 0; i<4; i++)
{
testArray[i] = new double[10];
}
...
JavaRDD<String> testRDD = sc.textFile("testfile", 4).mapPartitionsWithIndex(
new Function2<Integer, Iterator<String>, Iterator<String> >() {
@Override
public Iterator<String> call(Integer ind, Iterator<String> s) {
/*Update testArray[ind]*/
}
}, true
);
...
如果它应该工作,我想知道Spark如何将testArray的部分从worker发送到主节点?
答案 0 :(得分:2)
否。它不应该在分布式环境中工作。
闭包中捕获的变量将被序列化并发送给工人。最初在驱动程序中设置的数据将可供工作人员使用,但工作人员级别的任何更新只能在本地范围内访问。
在本地,变量位于相同的内存空间中,因此您可以看到更新,但不会扩展到群集。
您需要根据RDD操作转换计算以收集结果。