执行时间和持久性

时间:2019-07-11 21:13:05

标签: apache-spark pyspark

我是Spark的新手。在运行一些示例以尝试了解RDD持久性时,我遇到了一些我不理解的问题。请考虑以下两个实验:

实验1

我从计时一些动作开始而不使用持久性。

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。一切都如预期。

实验2

接下来,我将第一个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花费的时间长得多。每当我运行代码时,这都是正确的。

有什么想法吗?

0 个答案:

没有答案