如果我只有1个执行器,其内存为25 GB,并且一次只能运行一个任务,那么可以处理(转换和操作)1 TB数据(如果是),那么它将如何读取以及将中间数据存储在哪里?
同样对于同一场景,如果hadoop文件具有300个输入分割,那么RDD中将有300个分区,那么在这种情况下,那些分区在哪里?它将仅保留在hadoop磁盘上,我的单个任务将运行300次吗?
小智 5
我在hortonworks网站上找到了很好的答案。
与流行的看法相反,Spark不仅在内存中
a)简单阅读,不打乱(不加入,...)
对于最初的读取,像MapReduce这样的Spark会读取流中的数据并>处理它。即,除非有某种理由,spark不会在内存中实现完整的RDD(您可以告诉他去做,但是如果您要缓存一个小的数据集)RDD是有弹性的,因为spark知道如何重新创建它(从中读取一个块)例如hdfs),不是因为它存储在不同位置的mem中。(不过也可以这样做。)
因此,如果您过滤掉大部分数据或进行有效的聚合(在地图端进行聚合),则您将永远不会在内存中拥有完整的表。
b)随机播放
这与MapReduce非常相似,因为它会将映射输出写入磁盘,并通过化简通过http读取它们。但是,spark在Linux文件系统上使用了激进的文件系统缓冲策略,因此,如果操作系统具有可用的内存,则数据将不会实际写入物理磁盘。
c)洗牌后
随机播放后的RDD通常由引擎缓存(否则,发生故障的节点或RDD将需要完全重新运行作业),但是正如abdelkrim提到的那样,除非您否决Spark,否则Spark会将其泄漏到磁盘上。
d)火花流
这有点不同。除非您覆盖设置,否则Spark Streaming期望所有数据都适合内存。
Matei Zaharia最初的Spark设计论文也有帮助。(第2.6.4节:内存不足时的行为)
希望有一些有用的东西。
| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |