五 Spark RDD的使用原理

transformation与action

transformation函数: map, filter,flatMap, groupByKey,reduceByKey distinct,sortByKey,join,cogroup,cartesian
transformation:只是做一个简单的记录,对RDD做一个标注即要执行什么操作


action函数有: count() first() foreach()
countByValue, take(num),top(num), reduce(func):
action函数执行的时候,才真正的从hdfs中拿数据或者从本机,或者是cache里拿数据,然后执行相关的计算操作

实现原理

RDD是一个分布式数据集,顾名思义,其数据应该分部存储于多台机器上。事实上,每个RDD的数据都以Block的形势存储于多台机器上,
下图是Spark的RDD存储架构图,其中每个Executor会启动一个BlockManagerSlave,病管理一部分Block;
而Block的元数据由Driver节点的BlockManagerMaster保存。
BlockManagerSlave生成Block后向BlockManagerMaster注册该Block,
BlockManagerMaster管理RDD与Block的关系,当RDD不再需要存储的时候,将向BlockManagerSlave发送指令删除相应的Block

RDD cache的原理:
       RDD的转换过程中,并不是每个RDD都会存储,如果某个RDD会被重复使用,或者计算其代价很高,那么可以通过显示调用RDD提供的cache()方法,把该RDD存储下来。那RDD的cache是如何实现的呢?
       RDD中提供的cache()方法只是简单的把该RDD放到cache列表中。当RDD的iterator被调用时,通过CacheManager把RDD计算出来,并存储到BlockManager中,下次获取该RDD的数据时便可直接通过CacheManager从BlockManager读出

RDD partitioner与并行度:
     每个RDD都有Partitioner属性,它决定了该RDD如何分区,当然Partition的个数还将决定每个Stage的Task个数。当前Spark需要应用设置Stage的并行Task个数(配置项为:spark.default.parallelism),在未设置的情况下,子RDD会根据父RDD的Partition决定,如map操作下子RDD的Partition与父Partition完全一致,Union操作时子RDD的Partition个数为父Partition个数之和。

如何设置spark.default.parallelism对用户是一个挑战,它会很大程度上决定Spark程序的性能。


RDD 在计算时,每个分区都会起一个task任务,因此分区数决定了task数目,申请的计算节点也叫Excutor的数目和每个计算节点CPU核数,决定同一个时刻可以并行执行的task。当RDD分区数目是20,也就是有20个task,你的资源大概是3台机器,每台机器6核,同一个时刻并行的task数目就是18个,完成这些task需要2个轮次,当你的分区弄成18个分区,就只要一个轮次就完成

猜你喜欢

转载自blog.csdn.net/xsjzdrxsjzdr/article/details/85418086