spark-2

数据分区
Spark是如何对数据集的节点进行分区控制的,在分布式程序中通信的代价是很大的,因此控制数据分区以获得最少的
网络传输可以极大地提升整体性能,和单节点的程序需要为记录集合选择合适的数据结构一样,Spark程序可以通过控制
RDD分区方式来减少通信开销。
分区的缺点:给定RDD只需要被扫描一次,我们完全没有必要对其预先分区处理,只有当数据集多次在诸如连接这种基于键的操作中使用
分区,对固定的值操作可以用使用分区 sc.textFile().partitionBy(new HashPartitioner(100))//构造100个分区。
partitionBy是一个转化操作rdd一旦创建就无法更改。分区数目会对这个RDD进行进一步操作,时有多少个任务会并行
执行,至少要和集群中的总核数保持一致。

获取RDD的分区方式

partitioner() 获取RDD的分区
通过rdd.partitionBy(new HashPartitioner(2))获取分区方法。

从分区中获益的操作
cogroup() groupWith() join() leftOuterJoin() groupByKey() reduceByKey() combineByKey() lookup()

reduceByKey 运行在未分区的RDD上的时候会导致每个键的所有对应值都在每台机器上进行本地计算,只需要把本
地最终规约的结果值从各个工作点传回到主节点,所以原本的网络开销就不算大

而对于cogroup和join这样的二元操作,预先进行数据分区会导致其中至少一个RDD(使用分区的RDD)不发生数据清洗
如果两个RDD使用同样的分区方式,并且他们还缓存在同样的机器上(比如一个RDD是通过mapValues()从另一个RDD创建出来,这两个RDD就会拥有相同的键和分区方式)那么跨接点的数据混洗就不会发生。

影响分区的操作

Spark内部知道各操作会如何影响分区方式,并将会对数据进行分区的操作结果RDD自动设置为对应的分区器。
例如:如果你调用join()来连接两个RDD;由于键相同的元素会被哈希到同一个机器上,Spark知道输出的结果也是
哈希分区,这样对连接结果进行注入reduceByKey()这样的操作是会明显变得很快。

总而言之对一个已创建分区的RDD进行操作时,如果不改变键值,则转换后的RDD还是创建分区的RDD,如果改变键值则会影响。

不过,转化操作的结果并不一定会按照已知的分区方式进行分区,这时候数据的RDD可能就会没有设置分区器。例如
当你对一个哈希分区的键值对RDD调用map(),由于map()会改变元素的键,因此结果就不会有固定的分区方式。
map操作:将一个pairmap转换为另一个pairMap
JavaRDD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值