`

spark-storage/memory used in spark

 
阅读更多

 

 access pattern in spark storage



 

 

 

 

 [1]

到目前为止,我们已经了解了spark怎么使用JVM的内存以及集群上执行槽是什么,目前为止还没有谈到task的一些细节,这将在另一个文章中提高,基本上就是spark的一个工作单元,作为exector的jvm进程中的一个线程执行,这也是为什么spark的job启动时间快的原因,在jvm中启动一个线程比启动一个单独的jvm进程块(在hadoop中执行mapreduce应用会启动多个jvm进程) 
下面将关注spark的另一个抽象:partition, spark处理的所有数据都会切分成partion,一个parition是什么以及怎么确定,partition的大小完全依赖数据源,spark中大部分用于读取数据的方法都可以指定生成的RDD中partition的个数,当从hdfs上读取一个文件时,会使用Hadoop的InputFormat来处理,默认情况下InputFormat返回每个InputSplit都会映射RDD中的一个Partition,大部分存储在HDFS上的文件每个数据块会生成一个InputSplit,每个数据块大小为64mb和128mb,因为HDFS上面的数据的块边界是按字节来算的(64mb一个块),但是当数据被处理是,它又要按记录进行切分,对于文本文件来说切分的字符就是换行符,对于sequence文件来说,他是块结束,如果是压缩文件,整个文件都被压缩了,它不能按行进行切分了,整个文件只有一个inputsplit,这样spark中也会只有一个parition,在处理的时候需要手动的repatition。

    [1]

 

 

在Spark内部,单个executor进程内RDD的分片数据是用Iterator流式访问的,Iterator的hasNext方法和next方法是由RDD lineage上各个transformation携带的闭包函数复合而成的。该复合Iterator每访问一个元素,就对该元素应用相应的复合函数,得到的结果再流式地落地(对于shuffle stage是落地到本地文件系统留待后续stage访问,对于result stage是落地到HDFS或送回driver端等等,视选用的action而定)。如果用户没有要求Spark cache该RDD的结果,那么这个过程占用的内存是很小的,一个元素处理完毕后就落地或扔掉了(概念上如此,实现上有buffer),并不会长久地占用内存。只有在用户要求Spark cache该RDD,且storage level要求在内存中cache时,Iterator计算出的结果才会被保留,通过cache manager放入内存池。


UPDATE 2 Spark被称为“内存计算引擎”是因为它可以做内存计算,而不是它只能做内存计算。早年因为在使用内存cache的情况下ML算法效率提升特别明显(1-2数量级),因此造成了一些误传,使得很多初学者都认为Spark只能做内存计算,数据集放不进内存就没辙了。实际上,内存cache对于Spark来说仅仅只是一个优化,即便完全关闭,效率仍然比MapReduce要来得高。去年Spark拿下Sort Benchmark的冠军也很能说明问题(sort过程全程不使用内存cache)。详情参见:Sort Benchmark Home Page
    [2]

 

 

ref:

[1]Spark 架构

[2] 内存有限的情况下 Spark 如何处理 T 级别的数据?

 http://support.huawei.com/huaweiconnect/enterprise/thread-326169.html

  • 大小: 33.4 KB
  • 大小: 46.5 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics