使用 k-means 聚类时如何设置 spark 配置以减少洗牌?

Posted

技术标签:

【中文标题】使用 k-means 聚类时如何设置 spark 配置以减少洗牌?【英文标题】:How to set spark configuration to reduce shuffling when working with k-means clustering? 【发布时间】:2018-09-06 14:14:14 【问题描述】:

我知道那里有很多“如何调整 Spark 作业”等博客文章和线程,但不幸的是,我的目标是使用 pyspark (k-means) 中的内置集群模块,所以建议像'使用 reduceByKey 而不是 groupByKey' 仍然对我没有多大帮助,因为在调用聚类算法后我无法真正控制代码中发生的事情,显然,它似乎消耗了大量的磁盘空间用于改组(在大小为 25 Gb 的 DataFrame 上运行)。

有什么方法可以绕过这个问题,比如建议的配置设置(执行程序内存等)?如果可能的话,我希望将用于 tmp 文件的已用磁盘空间保持在 100-150 Gb 以下。

总的来说,如果任何人在大数据上使用了 mllib 中的一种聚类算法(或类似我的大数据),我将不胜感激。 您能否以某种方式避免大范围的改组?如果可以,如何避免?

谢谢!

【问题讨论】:

不要使用 Spark 进行集群。使用它没有意义。良好的非 Spark 实现速度快 100 倍,当您的数据不再适合内存时,只需使用一个样本 - 它将与整个数据集一样准确。没有理由支付 Spark 的 100 倍罚款。 您指的是什么“良好的非 Spark”实现?我目前正在使用 python,所以接下来我想到的是 scikit-learn。 你有多少个内核和内存? 48 核和 252 Gb 即使只有一个内核,如果 sklearn 比 Spark 更快,我也不会感到惊讶。如果您想使用所有内核,请使用它(这是我所知道的最快的 KMeans,但 C 和非常专业)github.com/ghamerly/fast-kmeans 如果您想要快速的 Java 版本,请在 ELKI 中使用 KMeansSort(从Scala,如果你在那里进行预处理)。 【参考方案1】:

您有充足的资源 48 核和 252 Gb,因此如果您的数据帧名称为 df 则使用,然后在运行 k 表示代码之前请缓存您的数据,您可以使用持久或缓存方法:

df.persist()
df.count()

df.cache()
df.count()

在此之后,我们需要执行一些操作将数据帧缓存在内存中,您的洗牌肯定会减少,请告诉我这是否适合您

【讨论】:

嘿,所以我试过了,但似乎我仍然会得到很多临时文件,无论是这个还是我为执行程序和驱动程序指定的 RAM 量配置。也许我应该多玩一些 spark.shuffle.memoryFraction 和 spark.storage.memoryFraction 但恐怕在这种情况下仍然无法解决我的问题。 在参数中使用列数重新分区也会有所帮助,而且您需要看到执行操作时没有太多挂起的操作也会导致过多的改组,最好写表并在减少洗牌的一定数量的连接和过滤器后阅读

以上是关于使用 k-means 聚类时如何设置 spark 配置以减少洗牌?的主要内容,如果未能解决你的问题,请参考以下文章

使用 k-means 聚类时如何确定 k?

使用 k-means 聚类时如何确定 k?

使用 k-means 聚类时如何确定 k?

使用 k-means 聚类时如何确定 k?

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?