mllib代码如何在spark上运行?

时间:2016-11-27 06:57:40

标签: apache-spark apache-spark-mllib

我是分布式计算的新手,我正在尝试使用Spark的mllib kmeans在EC2上运行Kmeans。当我阅读教程时,我发现了以下代码片段 http://spark.apache.org/docs/latest/mllib-clustering.html#k-means enter image description here

我无法理解此代码在群集中的运行方式。具体来说,我无法理解以下内容:

  1. 将代码提交到主节点后,spark如何知道如何并行化作业?因为似乎没有代码的任何部分来处理这个问题。

  2. 代码是否已复制到所有节点并在每个节点上执行?主节点是否进行计算?

  3. 节点如何共享每次迭代的部分结果?这是在kmeans.train代码中处理的,还是spark核心会自动处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

  1. Spark将数据划分为多个分区。例如,如果从HDFS读取文件,则分区应等于HDFS中的数据分区。您可以通过repartition(numberOfPartitions)手动指定分区数。每个分区可以在单独的节点,线程等上处理。有时,数据由HashPartitioner分区,HashPartitioner查看数据的散列。
  2. 分区数和分区大小通常会告诉您数据是否正确分布/并行化。创建数据分区隐藏在RDD.getPartitions方法中。

    资源调度取决于集群管理器。我们可以发布关于它们的很长篇文章;)我认为在这个问题中,分区是最重要的。如果没有,请通知我,我会编辑答案。

    1. Spark序列化集群,这些集合作为转换和操作的参数提供。 Spark创建DAG,将其发送给所有执行程序,执行程序在数据上执行此DAG - 它会在每个分区上启动闭包。

    2. 目前,每次迭代后,数据都会返回给驱动程序,然后安排下一个作业。在Drizzle项目中,AMPLab / RISELab创建了一次创建多个作业的可能性,因此数据不会发送到驱动程序。它将创建DAG一次并安排即10次迭代的工作。它们之间的随机播放将受到限制/根本不存在。目前,DAG是在每次迭代中创建的,而作业是在计划执行者

    3. 中创建的

      Spark和Spark Drizzle中的资源调度非常有用presentation