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