我是分布式计算的新手,我正在尝试使用Spark的mllib kmeans在EC2上运行Kmeans。当我阅读教程时,我发现了以下代码片段 http://spark.apache.org/docs/latest/mllib-clustering.html#k-means
我无法理解此代码在群集中的运行方式。具体来说,我无法理解以下内容:
将代码提交到主节点后,spark如何知道如何并行化作业?因为似乎没有代码的任何部分来处理这个问题。
代码是否已复制到所有节点并在每个节点上执行?主节点是否进行计算?
节点如何共享每次迭代的部分结果?这是在kmeans.train代码中处理的,还是spark核心会自动处理它?</ p>
答案 0 :(得分:1)
repartition(numberOfPartitions)
手动指定分区数。每个分区可以在单独的节点,线程等上处理。有时,数据由HashPartitioner分区,HashPartitioner查看数据的散列。 分区数和分区大小通常会告诉您数据是否正确分布/并行化。创建数据分区隐藏在RDD.getPartitions
方法中。
资源调度取决于集群管理器。我们可以发布关于它们的很长篇文章;)我认为在这个问题中,分区是最重要的。如果没有,请通知我,我会编辑答案。
Spark序列化集群,这些集合作为转换和操作的参数提供。 Spark创建DAG,将其发送给所有执行程序,执行程序在数据上执行此DAG - 它会在每个分区上启动闭包。
目前,每次迭代后,数据都会返回给驱动程序,然后安排下一个作业。在Drizzle项目中,AMPLab / RISELab创建了一次创建多个作业的可能性,因此数据不会发送到驱动程序。它将创建DAG一次并安排即10次迭代的工作。它们之间的随机播放将受到限制/根本不存在。目前,DAG是在每次迭代中创建的,而作业是在计划执行者
Spark和Spark Drizzle中的资源调度非常有用presentation。