Ram*_*esh 17 apache-spark rdd apache-spark-sql
任何人都可以纠正我对Spark坚持的理解.
如果我们在RDD上执行了cache(),则它的值仅缓存在最初计算RDD的那些节点上.含义,如果存在100个节点的集群,则在第一个和第二个节点的分区中计算RDD.如果我们缓存了这个RDD,那么Spark将仅在第一个或第二个工作节点中缓存它的值.因此,当此Spark应用程序尝试在后续阶段使用此RDD时,Spark驱动程序必须从第一个/第二个节点获取值.
我对么?
(要么)
是RDD值持久存储在驱动程序内存而不是节点上的东西吗?
改变这个:
然后Spark将仅在第一个或第二个工作节点中缓存其值.
对此:
然后Spark将仅在第一个和第二个工作节点中缓存其值.
并且... 是的正确!
Spark试图最小化内存使用量(我们喜欢它!),所以它不会产生任何不必要的内存加载,因为它懒惰地评估每个语句,即它不会对任何转换做任何实际工作,它会等待一个动作发生,这使得没有选择Spark,而不是做实际工作(读取文件,将数据传递到网络,进行计算,将结果收集回驱动程序,例如......).
你看,我们不想缓存所有东西,除非我们真的可以(也就是内存容量允许它(是的,我们可以在执行程序或/和驱动程序中请求更多内存,但有时我们的集群只是没有资源,当我们处理大数据时真的很常见)并且它确实有意义,即缓存的RDD将被一次又一次地使用(因此缓存它将加速我们的工作的执行).
这就是为什么你想要unpersist()你的RDD,当你不再需要它时......!:)
检查此图像,来自我的一个工作,我请求了100个执行程序,但Executors选项卡显示101,即100个奴隶/工人和一个主/驱动程序:
| 归档时间: |
|
| 查看次数: |
8487 次 |
| 最近记录: |