这里我使用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文档时,我被告知缓存可以加快这个过程的速度吗?但是这里没有太大的区别,任何人都可以给我一个关于这个特定问题的暗示吗?火花缓存如何工作的一般介绍将是伟大的!谢谢!
答案 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在两次运行中都稍微快一点。