Spark Java关闭详细信息

时间:2018-09-07 03:42:51

标签: java apache-spark

我在下面有以下代码。我在每个CmProblem RDD上都调用了一个solve方法。我在实际编辑图形的Solve方法中传递了图形。

  

每个任务都会收到一个单独的图形实例吗?

     

图将成为执行者或单个任务的共享副本吗?

     

求解的每次执行都将是一个单独的任务吗?

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

如果没有,如何为所有Solve方法执行获得单独的图形副本?我知道我可以使用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 个答案:

答案 0 :(得分:1)

  

每个任务都会收到一个单独的图形实例吗?

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

  

求解的每次执行都将是一个单独的任务吗?

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

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

相关问题