Spark Java闭包详细信息

Spark Java闭包详细信息,java,apache-spark,Java,Apache Spark,我有下面的代码。对于每个CMRDD问题,我都会调用一种解决方法。我在solve方法中传入一个图,该方法实际编辑了该图 每个任务是否会收到一个单独的图形实例 该图是跨执行者还是跨单个任务的共享副本 solve的每次执行都是一个单独的任务吗 简而言之,由于驱动程序中的序列化和工作节点中的反序列化,对solve方法的每次调用都会收到graphbecause的新副本吗 如果没有,如何为所有求解方法执行实现单独的图形副本?我知道我可以使用Gson来传递图的序列化版本,并在solve方法中对其进行反序列化。

我有下面的代码。对于每个CMRDD问题,我都会调用一种解决方法。我在solve方法中传入一个图,该方法实际编辑了该图

每个任务是否会收到一个单独的图形实例

该图是跨执行者还是跨单个任务的共享副本

solve的每次执行都是一个单独的任务吗

简而言之,由于驱动程序中的序列化和工作节点中的反序列化,对solve方法的每次调用都会收到graphbecause的新副本吗

如果没有,如何为所有求解方法执行实现单独的图形副本?我知道我可以使用Gson来传递图的序列化版本,并在solve方法中对其进行反序列化。但是还有别的办法吗

    SparkConf conf = new SparkConf().setAppName("xyz").setMaster(sparkMaster);
    JavaSparkContext sc = new JavaSparkContext(conf);

    List<CmNode> inboundNodes = cmProblem.convertLoadsToNodes(cmProblem.getInboundLoads());

    CmGraph graph = new CmGraph(inboundNodes);

    List<CmNode> outboundNodes = cmProblem.convertLoadsToNodes(cmProblem.getOutboundLoads());
    Objects.requireNonNull(outboundNodes).sort(CmNode::compareTo);


    // divide problem
    List<CmProblem> cmProblems = getDividedProblems(cmProblem);
    JavaRDD<CmProblem> cmProblemJavaRDD = sc.parallelize(cmProblems);

    // call solve and merge solution
    List<CmSolution> cmSolutions = cmProblemJavaRDD.map(ea -> solve(ea, graph)).collect();


    //merge cmSolutions
    List<CmPath> paths = new LinkedList<>();

    for (CmSolution cmSolution : cmSolutions) {
        paths.addAll(CollectionUtils.isNotEmpty(cmSolution.getPaths()) ? cmSolution.getPaths() : new LinkedHashSet<>());
    }
每个任务是否会收到一个单独的图形实例

事实上,如果您有一个局部变量,并且您的作业将在分布式环境中执行,那么确定每个任务都有其自己的局部变量版本。此外,如果本地变量是自定义类的对象,那么它必须是可序列化的,当然也必须在将要提交的jar文件中。换句话说,图形变量将被发送给每个执行者,并分别用于每个任务

solve的每次执行都是一个单独的任务吗

任务的数量取决于RDD的分区数量。换句话说,对于每个任务,您将有多个solve方法调用

有关更多信息,您可以通过谷歌搜索并使用以下链接: