【问题标题】:How does mllib code run on spark?mllib 代码如何在 spark 上运行?
【发布时间】:2017-04-11 03:01:25
【问题描述】:

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

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

  1. 提交代码到master节点后,spark怎么知道job怎么并行化?因为似乎没有处理此问题的代码部分。

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

  3. 节点如何传达每次迭代的部分结果?这是在 kmeans.train 代码中处理的,还是 spark 核心自动处理它?

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:
    1. Spark 将数据划分为多个分区。例如,如果您从 HDFS 读取文件,则分区应该等于 HDFS 中的数据分区。您可以通过repartition(numberOfPartitions) 手动指定分区数。每个分区都可以在单独的节点、线程等上进行处理。有时数据通过 HashPartitioner 进行分区,它查看数据的哈希值。

    分区数和分区大小通常会告诉您数据是否正确分布/并行化。创建数据分区隐藏在 RDD.getPartitions 方法中。

    资源调度依赖于集群管理器。我们可以发布关于它们的很长的帖子;)我认为在这个问题中,分区是最重要的。如果没有,请告诉我,我会编辑答案。

    1. Spark 序列化 clusure,作为转换和动作的参数给出。 Spark 创建 DAG,该 DAG 被发送到所有 executors 并且 executors 在数据上执行这个 DAG - 它在每个分区上启动闭包。

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

    presentation 对 Spark 和 Spark Drizzle 中的资源调度很有帮助。

    【讨论】:

    • 对不起,如果我有任何不准确的地方。如果有人会看到任何错误,请给我打电话 - 我已经尽可能简单地解释它,也许在某个地方我可能太不精确了
    猜你喜欢
    • 2017-03-19
    • 2017-03-03
    • 1970-01-01
    • 2017-02-11
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多