【发布时间】:2018-04-04 18:04:35
【问题描述】:
我以 RDD 的形式从数据库中读取一堆记录并执行不同的操作。我了解Spark会在转换后自动释放中间RDD数据。它会再读一遍 从源头看,如果我们在程序的后半部分提到中间RDD。这是否意味着它将再次从数据库中读取数据?无论如何,有什么工具可以告诉我们应该缓存哪个中间结果以获得更好的结果?
【问题讨论】:
标签: apache-spark
我以 RDD 的形式从数据库中读取一堆记录并执行不同的操作。我了解Spark会在转换后自动释放中间RDD数据。它会再读一遍 从源头看,如果我们在程序的后半部分提到中间RDD。这是否意味着它将再次从数据库中读取数据?无论如何,有什么工具可以告诉我们应该缓存哪个中间结果以获得更好的结果?
【问题讨论】:
标签: apache-spark
Spark 被延迟评估,transformations(及其输出)不会实现,直到在DAG 中遇到操作。甚至persist/cache 也不是action,他们也很懒。
如果你的 DAG 中有一个 action 直到现在(你想要访问中间 RDD 的点),再加上你在中间 RDD 之前有一个 persist/cache,spark 将只从那个动作/缓存点重新计算。否则它将再次从数据库中读取。如果您没有任何操作,并且绝对想阻止再次读取数据库,您可以使用saveAsTextFile() 并再次读取。
【讨论】:
P 是父 RDD 并且您执行转换:T1) 将一列添加到 P T2) 在 P 上爆炸 T3) 将列添加到 P T4) 添加列到 T2 的结果。 T5) 在 T2 的结果中爆炸。请注意,您使用P 3 次& 转换结果T2 2 次和T2 来自P。你显然需要坚持P。现在你应该坚持T2?,这取决于多个因素:1)如果你可以同时在内存中保存P&T2,也坚持T2。 2)如果您没有足够的内存或T4 & T5 不是那么耗时,请不要坚持下去。请记住 T2 spark 将从 P 开始而不是从开始。