没有RDD、Dataset之前,做wordcount或别的大数据计算使用:
原生的python集合:比如python的list、set、map,但是只支持单机版,不支持分布式。如果要做分布式计算,需要做很多额外的工作,比如线程/进程的通信,容错,自动负载均衡。。等很麻烦。所以诞生了框架。
还可以用MapReduce:运行效率低下,开发效率也低下。
诞生了Spark/Flink,参考了原生的scala集合的设计,抽象出了新的数据类型-RDD/Dataset
RDD其实就是分布式集合,支持函数操作。。使用起来跟本地集合一样简单。开发速度快。底层基于分布式内存计算,是MR的100倍。
RDD到底是什么
弹性分布式数据集
弹性:【内存】和【CPU】都是可以扩展。中间数据存在【内存】,如果内存不够,可以溢写到【磁盘】
分布式:【存储】和【计算】都是分布式多节点上的
数据集:一个很大的抽象容器,使用起来跟python集合一样简单,支持【函数式】编程。
核心设计要点
不可变:集合的元素内部都不能改变,但是可以转换成新的集合。
可分区:RDD划分成几个部分区域。
并行计算:每个分区被一个任务处理,各任务并行计算。
源码中记录的RDD的5大特性
有一个分区列表:将【所有的数据】划分成合理的分区数。
计算函数:每个分区的数据上都有【函数】
依赖列表:RDD转换成新的RDD,也记录了依赖关系。
【可选】分区器:当RDD的元素是【键值对】时,可以指定分区器,规定了如何按key来分组到不同的分区中。默认是Hash分区器
【可选】最佳位置:记录了计算的最佳位置(移动代码比移动数据更划算)比如HDFS的block位置。
RDD的5大特性其实就是说明了:
数据在哪里? 在哪里计算?有哪些分区?使用什么分区器?使用什么函数计算?