有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spark Java闭包详细信息

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

Will each task receive a separate instance of the graph?

Will the graph be a shared copy across executors or across individual tasks?

Will each execution of solve be a separate task?

简而言之,每次调用solve方法都会收到一个新的graph副本(因为驱动程序的序列化和工作节点的反序列化)

如果没有,我如何为所有求解方法执行实现一个单独的图形副本?我知道我可以使用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<>());
    }

共 (1) 个答案

  1. # 1 楼答案

    Will each task receive a separate instance of the graph?

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

    Will each execution of solve be a separate task?

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

    有关更多信息,您可以通过谷歌搜索并使用以下链接:How are stages split into tasks in Spark?