spark初学者想问一个关于数据混洗的问题

看网上说除了count之外的bykey操作能引发数据混洗,在combineByKey()方法中,说是每个分区单独操作所以要传一个mergeCombine操作,将不同分区中同一个键值合并。但是数据混洗的过程不就是将键值按照其哈希值进行分区,这样的话不就可以保证相同的键值在同一个分区了吗,为什么还要将不同分区的同一个键值进行合并呐~
不知道是不是我对数据混洗理解有误,跪求大神指教~
全部评论
初学者来回答一下,我觉得他说的分区是来自不同map端的分区意思,你的分区是不同reduce端分区的意思
点赞 回复
分享
发布于 2019-04-16 17:11
combineByKey方法实际上需要传递三个方法,createCombiner,mergeValue,mergeCombiner三个,其中createCombiner和mergeValue是在map端进行聚合的时候使用,Map端会在一个外部排序Map中对数据进行聚集,并对数据按照reduce端的分区进行排序。而你提到的mergeCombiner是在reduce端fetch到所有map端的block之后对各个map端中所有包含自身reduce分区的数据进行merge。个人见解,欢迎指正。
点赞 回复
分享
发布于 2019-04-16 18:05
滴滴
校招火热招聘中
官网直投
简单来说,在shuffle过程中分为map阶段和reduce阶段,实际上map阶段会调用createCombiner方法和mergeValue方法对数据依据分区排序,但是此时数据并不实际移动,也就是说,在map阶段,不同map端可能存在相同的key,而若需要把不同map端相同的key聚合起来,就需要在reduce端使用mergeCombiner方法,而真正的数据移动是发生在reduce端,他会根据MapOutputTracker跟踪到map端的数据存储信息,并通过网络传输fetch数据,这时才真正发生数据的移动,才是真正的shuffle发生的时间点。
点赞 回复
分享
发布于 2019-04-16 18:09

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务