我从GitHub页面(https://github.com/ThinkBigAnalytics/pyspark-distributed-kmodes)使用pyspark实现了K模式的分布式版本。实现后的算法完全遵循本文的方法。 (http://www.ijerd.com/paper/vol11-issue3/Version_1/J1137989.pdf)
简而言之,我要做的是首先在每个分区中随机选择集群,然后在每个分区中进行Kmodes。之后,我在主节点中针对每个分区中的这些居中群集运行本地Kmodes以查找最终群集。
问题是我发现它在AWS EMR中可以在一个主节点和两个工作节点上正常工作(剪影得分大于0.7),但是如果我选择两个以上工作节点或更改工作节点类型(剪影,则情况会更糟)分数小于0.3)。
特别是:
1)如果有一个工作节点,则结果始终> 0.7;
2)如果有两个工作程序节点,则仅当硬件类型为m4.2xlarge时,结果才> 0.7;
3)如果有两个以上的工作节点,则无论硬件类型是什么,结果总是差很多;
由于此方法是基于分区的,因此我已经尝试在运行模型之前每次使用repartition()或coalesce()将分区固定为相同的编号。但是结果仍然相同。有人知道为什么会这样吗?
我在图表中附加了部分文档以供参考(尽管文档中的数据很小,我也尝试了50m行,并且结果相同)
谢谢。
环境:
AWS EMR:Hadoop 2.8.4;利维0.5.0;蜂巢2.3.3; Spark 2.3.2;