Apache spark 在使用k-means集群时,如何设置spark配置以减少洗牌?

Apache spark 在使用k-means集群时,如何设置spark配置以减少洗牌?,apache-spark,serialization,pyspark,apache-spark-sql,apache-spark-mllib,Apache Spark,Serialization,Pyspark,Apache Spark Sql,Apache Spark Mllib,我知道有很多“如何调整你的Spark工作”等博客帖子和帖子,但不幸的是,我的目标是使用pyspark(k-means)中的内置集群模块,所以像“使用reduceByKey而不是groupByKey”这样的建议对我帮助不大,因为调用集群算法后,我无法真正控制代码中发生了什么,而且显然,它似乎要消耗大量磁盘空间来进行洗牌(在大小为25 Gb的数据帧上运行) 是否有任何方法,如建议的配置设置(执行器内存等),我可以用来绕过这个问题?如果可能的话,我更愿意将tmp文件使用的磁盘空间保持在100-150

我知道有很多“如何调整你的Spark工作”等博客帖子和帖子,但不幸的是,我的目标是使用pyspark(k-means)中的内置集群模块,所以像“使用reduceByKey而不是groupByKey”这样的建议对我帮助不大,因为调用集群算法后,我无法真正控制代码中发生了什么,而且显然,它似乎要消耗大量磁盘空间来进行洗牌(在大小为25 Gb的数据帧上运行)

是否有任何方法,如建议的配置设置(执行器内存等),我可以用来绕过这个问题?如果可能的话,我更愿意将tmp文件使用的磁盘空间保持在100-150 Gb以下

总的来说,如果有人真的使用了大数据上的mllib中的一种聚类算法(或者像我这样的大ish),我将非常感谢您是否能够以某种方式避免大量洗牌?如果是,如何避免?


谢谢

您有足够的资源48个内核和252 Gb,因此如果您的数据帧名称为df,请使用。然后,在运行k means代码之前,请缓存您的数据。您可以使用persist或cache方法来缓存相同的数据:

df.persist()
df.count()


我们需要执行一些操作来缓存内存中的数据帧。在此之后,您的洗牌肯定会减少,请务必让我知道这对您是否有效。

根本不要使用Spark进行群集。使用它是没有意义的。好的非Spark实现速度快100倍,当您的数据不再适合内存时,只需使用一个示例—它将与整个数据集一样精确。没有理由支付Spark 100倍的罚款。你指的是什么“好的非Spark”实现?我现在正在使用python,所以我想到的下一件事是scikit-learn。您有多少个内核和RAM?48个内核和252 Gb如果sklearn比Spark更快,即使只有一个内核,我也不会感到惊讶。如果您想使用所有内核,请使用这个(这是我所知道的最快的KMeans,但是C和非常专业的)如果您想要一个快速的Java版本,请使用ELKI中的Kmeansort(如果您在那里进行预处理,从Scala访问可能会更容易、更高效)。嘿,所以我尝试了一下,但似乎我仍然从洗牌中得到了很多临时文件,不管这个或者我在配置中为执行器和驱动程序指定了多少RAM。也许我应该多玩一点spark.shuffle.memoryFraction和spark.storage.memoryFraction,但我担心这仍然不能解决我在这种情况下的问题。使用参数中的列数重新分区也会有所帮助,而且您还需要看到,在执行操作时,没有太多的挂起操作结果是洗牌太多,最好在一定数量的联接和过滤器之后写入表和读取,以减少洗牌
df.cache()
df.count()