RDD
**是一个 分布式、弹性、可容错的抽象数据集,代表着一个不可变的,可分区的,可以并行执行的一个集合
RDD中不保存计算的数据,保存的式元数据,即数据的描述信息和运算逻辑,比如数据要从哪里读取,怎么运算等
RDD 可以被认为是一个代理, 你对RDD 进行操作,相当于在Driver 端先是记录下计算的描述信息,然后生成Task ,将Task 调度到 Executor 端才执行真正的计算逻辑**
RDD特点
一 有多个分区,分区数量决定任务并行数
① 从HDFS 中读取 :
1)如果是从HDFS中读取数据,分区的数量由hdfs 中数据的输入切片数量决定
2)sc.textFile 可以指定 rdd 的分区数量
3)sc.textFile 最小的分区数量为2
4) 如果一个大文件 ,一个小文件 ,大文件大于小文件的1.1倍 ,大文件会有 2 个输入切片
5) 当分区的数量大于切片的数量,多个Task可以读取一个输入切片; 当分区的数量小于切片的数量,RDD分区的数量由切片的数量决定
② 将Driver 端集合并行化成 RDD
1)RDD 默认分区的数量由 total-executor-cores 决定
2) 可以在sc.parallelize (arr ,6 )指定分区的数量
3)makeRDD 底层调用的是 parallelize 方法
二
一个功能函数作用在分区上,函数决定计算逻辑
三
RDD 和RDD 存在依赖关系,可以根据依赖关系恢复失败的任务和划分Stage
四
如果发生Shuffle ,要使用分区器 ,默认使用HashPartitioner ,分区器决定数据到下游哪个分区
五 最有位置
即 将Executor 调度到数据所在的节点上,要求Worker 和 DataNode 部署在同一个节点或OnYarn ,通过访问NameNode 获取数据块 位置信息
(分区和分区器的区别)
分区是 决定了RDD 有多少并行度,决定了一个Stage里面有多少Task
分区器是 在shuffle 的时候 决定每一个分区里面的每一条数据 要落到下游的哪一个分区,默认使用的是 HashPartitioner