spark尽可能避免收集

g2ieeal7  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(377)

我看到,对于任何使用spark的人(在我使用scala的例子中)的一般建议是避免任何将所有数据从执行者获取到驱动程序的操作(collect、count、sum等)。然而,当我尝试使用spark统计库时http://spark.apache.org/docs/2.2.0/ml-statistics.html 我发现相关矩阵和chisquaretest方法的参数是array或array\ seq得到的矩阵,因此,如果我想使用这个函数,我不知道如何避免对dataframe进行collect(以及我假设的更多操作,使其成为vectors而不是row类型)。谢谢你的帮助。

oiopk7p5

oiopk7p51#

在你的例子中,两者 Correlation.corr 以及 ChiSquareTest.test 正在接受Dataframe,因此在将数据传递给这些函数之前不需要收集数据。这些函数的结果必须在驱动程序上收集,但这不会引起任何问题,因为输出大小应该比初始数据集小得多,并且应该很容易放入驱动程序的内存中。
关于你在评论中的问题 groupBy / joins -这些是“昂贵的”,但原因不同。分组和联接会导致数据洗牌—因此,您的工作人员需要通过网络发送大量数据,这比本地数据处理要花费更多的时间。尽管如此,如果您必须这样做,也可以这样做,只需注意性能影响。 collect 方法不建议在完整的数据集上使用,因为它可能会导致驱动程序出现oom错误(想象一下,您有50 gb的数据集,分布在一个集群上,现在在单个节点上收集),但是如果您已经处理了数据,并且您知道,会有一些合理数量的行,那么这样做是非常安全的。 count 从内存的Angular 看,这根本不是问题,因为它只返回数据集中的行数,而不是将所有行都发送到驱动程序节点。

相关问题