apachespark:更新workers中的全局变量

hc8w905p  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(329)

我很好奇下面的简单代码是否能在分布式环境下工作(它在独立环境下也能正常工作)?

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发送到master节点?

twh00eeo

twh00eeo1#

不,它不应该在分布式环境中工作。
在闭包中捕获的变量将被序列化并发送到worker。最初在驱动程序中设置的数据将对工作程序可用,但工作程序级别的任何更新将只能在本地范围中访问。
在local上,变量位于相同的内存空间中,因此可以看到更新,但这不会扩展到集群。
为了收集结果,需要将计算转换为rdd操作。

相关问题