pyspark缓存似乎没有加速

时间:2017-07-23 00:00:37

标签: apache-spark caching pyspark

这里我使用pyspark来做一个简单的wordcount,我使用了缓存方法,但是第二次运行代码似乎没有加速:

from pyspark import SparkContext
from time import time
if __name__=='__main__':
    sc=SparkContext()
    rdd=sc.textFile("shakespear.txt")
    rdd.cache()
    t1=time()
    rdd.flatMap(lambda r:r.split(" "))\
       .map(lambda w:(w,1))\
       .reduceByKey(lambda x,y:x+y)\
       .collect()
    t2=time()
    print t2-t1
    t3=time()
    rdd.flatMap(lambda r:r.split(" "))\
       .map(lambda w:(w,1))\
       .reduceByKey(lambda x,y:x+y)\
       .collect()
    t4=time()
    print t4-t3

然后结果是:

3.87242698669
2.49692296982

如果我注释掉rdd.cache(),结果是:

3.58677482605
2.52048921585

在阅读spark文档时,我被告知缓存可以加快这个过程的速度吗?但是这里没有太大的区别,任何人都可以给我一个关于这个特定问题的暗示吗?火花缓存如何工作的一般介绍将是伟大的!谢谢!

2 个答案:

答案 0 :(得分:0)

首先,调用cache不会计算任何内容。它仅指定计算RDD时,结果被缓存。 RDD的计算仅由collect等行为触发。

但是,只有在第二次访问时使用与RDD相同的引用时才能使用缓存。例如,这是上面程序的一个版本,其中第二个计算实际上将使用缓存:

from pyspark import SparkContext
from time import time
if __name__=='__main__':
    sc=SparkContext()
    rdd=sc.textFile("shakespear.txt")
    rdd.cache()
    t1=time()
    rdd2 = rdd.flatMap(lambda r:r.split(" "))\
              .map(lambda w:(w,1))\
              .reduceByKey(lambda x,y:x+y)\
    rdd2.collect()
    t2=time()
    print t2-t1
    t3=time()
    rdd2.collect()
    t4=time()
    print t4-t3

请注意,我创建了一个名为rdd2的新变量,它定义了您要重新计算的转换。

答案 1 :(得分:-1)

该文本文件可能足够小,以至于Spark在会话期间隐式缓存它,因此两次运行之间没有太大区别,以及为什么第二次调用rdd在两次运行中都稍微快一点。