python - Kmeans 与 Spark

标签 python mapreduce k-means apache-spark

以下是用Apache Spark编写的Kmeans算法的一部分:

closest = data.map(lambda p: (closestPoint(p, kPoints), (p, 1)))
pointStats = closest.reduceByKey(lambda (x1, y1), (x2, y2): (x1 + x2, y1 + y2))
newPoints = pointStats.map(lambda (x, (y, z)): (x, y / z)).collect()

谁能向我解释一下它是如何工作的?假设我们有两个集群和 1000 个点,我们希望在具有两个从节点和一个主节点的集群中运行它。我认为第一个函数(最接近的)可以被认为是映射器,第二个函数是组合器,但是最后一个函数应该做什么呢?哪一个充当 reducer ?

最佳答案

您向 reduceByKey 传递一个可用作组合器和化简器的函数,因为您需要向它传递一个聚合函数,如果您的用例无法使用组合器,则需要使用groupByKey。是的,每当您在 Spark 中的 RDD 上调用 map 时,您传递的函数都可以被视为映射器。您绝对应该看看 RDD docsPairRDDFunctions 。请记住,Spark 程序往往会具有多个映射和缩减阶段,因为它试图将中间输出保留在内存中,而标准 Hadoop MapReduce 每次都会从磁盘读取和写入。另外,如果您使用 Spark,则可以使用 k-means in MLlib

更新:
引用您的评论,他们“将(总和/数字点)映射到每个从节点”的原因是因为 Spark 的工作方式意味着这没有开销。由于 Spark 对每个 RDD 使用 DAG,因此在执行操作(如本例中的 collect())之前不会计算任何内容,因此最后的映射实际上可以无缝地获取 reducer 的输出,这不应溢出到磁盘,因为它非常小。这类似于 ChainReducer在Hadoop中,但是在Spark中,连接的RDD中的每一步都保存在内存中(显然这并不总是可能的,所以有时它会溢出到磁盘,这也取决于序列化级别)。所以基本上最后的计算实际上将在与 reducer 相同的节点上完成(之后不需要洗牌),然后才收集到驱动程序。

关于python - Kmeans 与 Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613376/

相关文章:

python - 如何确定嵌套列表结构是否与另一个相同,但元素交换为新的

Python Pygame 按键创建矩形或任意图形

perl - 为什么我的 reducer 出现故障? (Hadoop)

c# - 哪种聚类算法适用于不知道k的一维列表?

visual-studio-2010 - 在行 .`` 花瓣宽度`|]) 行上出现缺少资格错误

python - 在图像中应用智能阈值的方法

python - 黑白图像文档聚类

hadoop - Cloudera CDH4安装

java - 使用cloudant的java客户端如何获取计数?

python - 如何解释 K-Means 聚类的轮廓系数?