一、分区的作用
RDD是弹性分布式数据集,通常RDD很大,会被分成很多个分区,分别保存到不同的节点上。
①、对RDD分区,第一个功能是增加并行度。
例如,1个RDD有n个分区,分布在n个不同工作节点(WorkerNode)上面,这n个工作节点分别启动n个线程对这n个分区的数据进行并行处理,从而增加了任务的并行度。(1个工作节点上面有几个分区,启动几个线程)
②、对RDD分区,第二个功能是减少通信开销。
连接(Join)是查询分析中经常发生的一种操作。
假设在某种应用中需要对两个表进行连接操作,第一个表是很大的用户信息表UserData(UserId, UserInfo),其中,UserId和UserInfo是用户信息表的两个字段,UserInfo包含了某个用户所定阅的主题信息;第二个表是比较小的Events(UserId, LinkInfo),只记录了过去五分钟内发生的事件,即某个用户访问查看了哪些链接。为了对用户访问情况进行了解,需要周期性地对UserData和Events这两个表进行连接操作,并获得(UserId, UserInfo, LinkInfo)这种形式的效果,从而知道某用户订阅的是哪个主题,以及访问了哪个链接。
在执行Spark作业时,UserData表会被加载到内存中生成RDD(即userData),RDD中的每个元素是<UserId, UserInfo>这种类型的键值对;同理,Events表会被加载到内存中生成RDD(即events),RDD中的每个元素是<UserId, LinkInfo>这种类型的键值对。
{
由于UserData是一个很大的表,通常会被存放到HDFS文件中,Spark系统会根据每个元素的数据来源,把每个RDD元素放在相应的节点上。例如:从工作节点u1上的HDFS文件块中读取到的记录,其生成的RDD元素(<UserId, LinkInfo>键值对)就会被放在节点u1上面,最终ÿ