【问题标题】:How to control implicit caching of RDDs by Spark?如何通过 Spark 控制 RDD 的隐式缓存?
【发布时间】:2015-06-02 04:20:20
【问题描述】:

作为 Spark 的新手,我一直在查看他们的 python example for estimation of PI

我有兴趣通过在同一上下文中多次重新估计 PI 来了解 Spark 的性能。

我观察到,在这些重新估计中,PI 的值没有变化,性能时序似乎表明中间 RDD 被隐式缓存,然后在后续计算中重复使用。

有没有办法配置 Spark 来控制这种行为,并且中间 RDD 总是重新生成?使用 unpersist() 似乎没有效果。

我产生这个问题的代码是github上的here,通过调用来执行

`spark-submit pi2.py` 

得到以下结果:

No caching-0: 8000 generated 6256 in 1.14984297752 secs (PI = 3.128)
No caching-1: 8000 generated 6256 in 0.0597329139709 secs (PI = 3.128)
No caching-2: 8000 generated 6256 in 0.0577840805054 secs (PI = 3.128)
No caching-3: 8000 generated 6256 in 0.0545349121094 secs (PI = 3.128)
No caching-4: 8000 generated 6256 in 0.0544559955597 secs (PI = 3.128)
With caching-0: 8000 generated 6256 in 0.069139957428 secs (PI = 3.128)
With caching-1: 8000 generated 6256 in 0.0549170970917 secs (PI = 3.128)
With caching-2: 8000 generated 6256 in 0.0531771183014 secs (PI = 3.128)
With caching-3: 8000 generated 6256 in 0.0502359867096 secs (PI = 3.128)
With caching-4: 8000 generated 6256 in 0.0557379722595 secs (PI = 3.128)`

【问题讨论】:

  • 我有一种感觉,由于你的种子调用,你从随机获得相同的价值
  • 我没有在您的代码中看到对 cache 的显式调用。
  • 无论是否调用seed(),我都会得到相同的结果。但是,我将它包括在内以在每个测试中强制为随机数生成一个新种子 - 根据 python 文档(9.6),它应该使用系统时间作为种子值。
  • 显式调用缓存——正是我的观点!代码性能和相同的结果表明正在发生缓存,当我预计中间 RDD 被丢弃时 - 即对于每个“无缓存”测试,我预计 PI 的值不同。然后我调用persist()(相当于cache()),然后我希望它持久化中间RDD,这样所有的'With caching'结果应该是相同的并且明显更快。

标签: caching apache-spark persist rdd


【解决方案1】:

这里发生了一些事情。首先,您实际上并没有缓存 RDD。从您的 Github 链接:

# Now persist the intermediate result
sc.parallelize(xrange(1, n + 1), partitions).map(f).persist()

这会创建一个新的 RDD,做一个映射,然后持久化生成的 RDD。你没有保留对它的引用,所以它现在实际上已经消失了。

接下来,第一次运行可能会更慢,因为 Spark 会将您的函数广播给您的工作人员。所以有一些缓存在起作用,但不是为了数据,而是为了你的代码。

最后,随机性:seed() 在驱动程序中植入 RNG。种子值在第一次运行时与f() 一起广播给所有工作人员(因为在random() 中引用了种子)。当您现在再次调用 seed() 时,它会更改驱动程序中的种子,但不会更改已发送给工作人员的函数版本,因此您会一遍又一遍地得到相同的结果。

【讨论】:

  • 我已更新我的代码以在此处反映您的 cmets:github.com/gford1000/spark-pi/blob/master/pi3.py 现在可以按预期工作。鉴于正在转移状态, random.seed() 不合适,所以我成功切换到 random.SystemRandom 以在每个worker上生成不同的随机值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多