Spark shuffle

Shuffle这个词在spark和mr中经常被提及,经常被翻译成『洗牌』、『混洗』,这样翻译并不容易理解,其实可以翻译成『数据重分布』,因为对从事OLAP的同学来说,大家对『重分布』这个概念是熟悉的。

什么是Shuffle

shuffle是Spark用于执行数据重分配的机制,以便对数据实现跨分区重新分组操作。这会导致跨执行器和机器的数据复制,因此它是一个复杂且消耗资源的操作。

为什么需要shuffle

我们以reduceByKey操作为例。reduceByKey操作生成一个新的RDD,其中单个键的所有值都组合成一个元组-(键,针对与该键关联的所有值执行reduce函数后的结果)。挑战在于,单个键对应的所有值并非都正好位于同一分区甚至同一台机器上,但它们必须位于同一位置(节点或执行器里)才能计算出结果。

在Spark中,数据通常不会跨分区分布在特定操作的必要位置。换句话说,通常情况下数据不会提前按照特定操作的需要分布在相应的位置(同一个机器或执行器里)。

在GreenPlum、oceanBase中也是如此,理想状态:执行groupby或join on所需的键就是表的分布键,这样的话,数据已经按照分布键提前集中在一起了,每个分布式计算任务在自己的本地计算节点就能就地取到计算所需的数据,那就不需要跨节点拉取所需数据了。通常情况下,以上理想状态很少出现,即计算所涉及的键正好是分布键的情况很少发生。

这里举个GreenPlum官网的例子:维度表customer表在Segment上通常按照客户的cust_id分布,而事实表sales表通常是按照sale_id分布。为了执行两个表的连接join操作,sales元组必须按照c

你可能感兴趣的:(PySpark简明教程,数据开发,spark,大数据,分布式,shuffle,数据倾斜)