原标题:Spark会把数据都载入到内存么
很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。
比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:1、RDD的定义,RDD是一个分布式的不可变数据集合;2、Spark 是一个内存处理引擎
如果你没有主动对RDD进行Cache/Persist等相关操作,它不过是一个概念上存在的虚拟数据集,你实际上是看不到这个RDD的数据的全集的(他不会真的都放到内存里)。
RDD的本质是什么
一个RDD 本质上是一个函数,而RDD的变换不过是函数的嵌套。RDD我认为有两类:
1、输入RDD,典型如KafkaRDD,JdbcRDD以及HadoopRDD等
2、转换RDD,如MapPartitionsRDD
我们以下面的代码为例做分析:
sc.textFile(abc.log).map().saveAsTextFile()
textFile 中间会构建出一个HadoopRDD,然后返回了MapPartitionsRDD
map函数运行后会构建出一个MapPartitionsRDD
saveAsTextFile触发了实际流程代码的执行
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。
HadoopRDD是数据来源,每个parition负责获取数据,获得过程是通过iterator.next 获得一条一条记录的。假设某个时刻拿到了一条数据A,这个A会立刻被map里的函数处理得到B(完成了转换),然后开始写入到HDFS上