Spark处理1Tb数据不需要1Tb的内存。
具体需要多少内存是根据executor的core数量和每次读取数据集的block大小决定的。以读取hdfs上1tb大文件为例:若每个block大小为128mb,则一共有8192个block,产生的task也有8192个。假如executor的core为2,内存为1g,则executor同时可运行2个task,此时每个task可获得的堆内存最大约为127.2m,这个配置下去处理一个block的数据会出现oom: java heap space。此时我们把内存加大到2g,则每个task最大可用堆内存约为500mb,基本满足一个block的处理需求(当然这里只是做一些简单的操作说明,不做一些程序使得oom的操作)。
此时spark程序只有一个executor,同一时间处理2个task,其他8190个task一直pendding等待直到这2个task计算完毕再计算其他task。数据只有在task在executor运行时才会加载到executor的内存中,所以处理1tb的数据并不需要1tb的内存。
记录至About云铁粉群