普通Shuffle
2017-01-13 09:57:41 0 举报
普通Shuffle是一种常见的洗牌方式,通常用于将一组有序或无序的物品重新排列。在扑克牌游戏中,玩家通常会使用普通Shuffle来确保牌的随机性。操作方法如下:首先,将一副牌面朝下放在桌面上;然后,玩家用一只手拿起一部分牌,通常是一半左右,并用另一只手将这些牌在空中快速地来回晃动,使得牌与牌之间产生摩擦和碰撞;接着,玩家再将手中的牌放回桌面,重复这个过程几次,直到所有的牌都被洗牌。通过这种方式,原本有序的牌被彻底打乱,每张牌都有相同的机会出现在任何位置。普通Shuffle简单易学,适用于各种场合。
作者其他创作
大纲/内容
ResultTask
Bucket
每个ShuffleMapTask都会为每一个ResultTask创建一个Bucket缓存,以及对应的ShuffleBlockFile磁盘文件
MapPartitionsRDD
ShuffleMapTask的输出,会作为MapStatus,发送到DAGScheduler的MapOutputTrackerMaster中。每个ResultTask会用BlockStoreShuffleFetcher去MapOutputTrackerMaster获取自己要拉取的文件信息,然后底层通过BlockManager将数据拉取过来
ShuffleMapTask
每个ResultTask拉取过来的数据,实际就组成了一个内部RDD,叫ShuffledRDD,优先放入内存,如果内存不够放入硬盘
ShuffleBlockFile
ShuffledRDD
然后每个ResultTask针对数据进行聚合,最后生成MapPartitionsRDD,就是我们执行reduceByKey等操作希望获得的那个RDD
假设在一个节点上运行了4个ShuffleMapTask,节点上只有两个Cpu Core
第一个特点, 在Spark早期版本中,那个bucket缓存是非常非常重要的,因为需要将一个ShuffleMapTask所有的数据都写入内存缓存之后,才会刷新到磁盘。但是这就有一个问题,如果map side数据过多,那么很容易造成内存溢出。所以spark在新版本中,优化了,默认那个内存缓存是100kb,然后呢,写入一点数据达到了刷新到磁盘的阈值之后,就会将数据一点一点地刷新到磁盘。 这种操作的优点,是不容易发生内存溢出。缺点在于,如果内存缓存过小的话,那么可能发生过多的磁盘写io操作。所以,这里的内存缓存大小,是可以根据实际的业务情况进行优化的。第二个特点, 与MapReduce完全不一样的是,MapReduce它必须将所有的数据都写入本地磁盘文件以后,才能启动reduce操作,来拉取数据。为什么?因为mapreduce要实现默认的根据key的排序!所以要排序,肯定得写完所有数据,才能排序,然后reduce来拉取。 但是Spark不需要,spark默认情况下,是不会对数据进行排序的。因此ShuffleMapTask每写入一点数据,ResultTask就可以拉取一点数据,然后在本地执行我们定义的聚合函数和算子,进行计算。 spark这种机制的好处在于,速度比mapreduce快多了。但是也有一个问题,mapreduce提供的reduce,是可以处理每个key对应的value上的,很方便。但是spark中,由于这种实时拉取的机制,因此提供不了,直接处理key对应的values的算子,只能通过groupByKey,先shuffle,有一个MapPartitionsRDD,然后用map算子,来处理每个key对应的values。就没有mapreduce的计算模型那么方便。
0 条评论
下一页