分而治之的火花

我正在学习Spark,并尝试处理一些巨大的数据集。我不明白为什么使用以下策略(伪)看不到阶段完成时间的减少:

data = sc.textFile(dataset).cache()

while True:
    data.count()
    y = data.map(...).reduce(...)
    data = data.filter(lambda x: x < y).persist()

所以想法是选择y,以便在大多数情况下将数据减半。但是由于某种原因,看起来所有数据总是在每个count()上再次被处理。

这是某种反模式吗?我应该怎么用Spark做到这一点?

vfc123_vgfgfcv 回答:分而治之的火花

是的,那是反模式。

map与Spark中的大多数(但不是全部)分布式基元相同,但从定义上讲,它几乎是一种分而治之的方法。您获取数据,计算拆分,然后将各个拆分的计算透明地分布到集群中。

尝试使用高级API进一步划分此过程完全没有意义。充其量,它根本不会带来任何好处,最糟糕的是,它将招致多次数据扫描,缓存和溢出的代价。

,

Spark是惰性计算的,因此在上方的forwhile循环中,对data.filter的每次调用不会顺序返回数据,而是顺序返回要执行的Spark调用后来。所有这些调用都会汇总,然后在以后执行时同时执行。

尤其是,结果将保持未评估状态,仅在调用Spark Action之前代表结果。超过某个时间点,应用程序将无法处理那么多并行任务。

在某种程度上,我们遇到了两种不同表示形式之间的冲突:conventional structured coding with its implicit (or at least implied) execution patterns and independent,distributed,lazily-evaluated Spark representations

本文链接:https://www.f2er.com/3093356.html

大家都在问