我是Spark的新手。在运行一些示例以尝试了解RDD持久性时,我遇到了一些我不理解的问题。请考虑以下两个实验:
我从计时一些动作开始而不使用持久性。
np.random.seed(1)
numbers = sc.range(0, 10000000)
evens = numbers.filter(lambda x : x % 2)
t1 = time.time()
evens.collect()
t2 = time.time()
evens.collect()
t3 = time.time()
evens.count()
t4 = time.time()
print(t2 - t1)
print(t3 - t2)
print(t4 - t3)
我跑了几次,每次我都得到类似的东西:
4.334701299667358
4.289132833480835
3.77268123626709
然后,我在evens.persist()
的定义之后立即添加了一行evens
。此代码的一些典型结果是:
4.4880735874176025
0.7230954170227051
1.4762592315673828
到目前为止,一切都很好。在每种情况下,第一个collect()
花费的时间大约相同,但是第二个collect()
和count()
花费的时间大大少于持久化RDD。一切都如预期。
接下来,我将第一个collect()
换成count()
。没有坚持,我的代码是:
np.random.seed(1)
numbers = sc.range(0, 10000000)
evens = numbers.filter(lambda x : x % 2)
t1 = time.time()
evens.count()
t2 = time.time()
evens.collect()
t3 = time.time()
evens.count()
t4 = time.time()
print(t2 - t1)
print(t3 - t2)
print(t4 - t3)
此代码的典型输出为:
4.011156320571899
4.720277786254883
3.8882973194122314
但是当我添加evens.persist()
时,我得到的输出如下:
5.5741260051727295
0.6982665061950684
1.5375416278839111
由于某种原因,使用持久性RDD时使用第一个count()
所花的时间要比使用非持久性RDD花费的时间长得多。每当我运行代码时,这都是正确的。
有什么想法吗?