五 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个分区,就只要一个轮次就完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值