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 楼答案
事实上,如果您有一个局部变量,并且您的作业将在分布式环境中执行,那么确定每个任务都有其自身版本的局部变量。此外,如果本地变量是自定义类的对象,那么它必须是可序列化的,当然也必须在将要提交的jar文件中。换句话说,图形变量将被发送给每个执行者,并分别用于每个任务
任务的数量取决于RDD的分区数量。换句话说,对于每个任务,您将有多个solve方法调用
有关更多信息,您可以通过谷歌搜索并使用以下链接:How are stages split into tasks in Spark?