什么是数据倾斜
并行处理数据集的某个task处理的数据明显多于其他task。
发生数据倾斜的原因
一个词概括:shuffle
在Shuffle的过程中,同样一个Key一般都会交给一个Task去处理,如果某个key特别多,如上图中task3的key有80亿,这样就会造成别的task很快算完,而task3却一直在计算中,对于spark来说下游的stage又必须得等上游stage全部计算完成后才能开始计算,这样task3就成了整个任务的性能瓶颈。
通俗理解shuffle
Shuffle过程,简单来说,就是将分布在集群中多个节点上的同一个Key,拉取到同一个节点上,进行聚合或Join等操作。例如,reduceByKey、join等算子,都会触发Shuffle操作。Shuffle过程中,各个节点上的相同Key都会先写入本地磁盘文件中,然后其他节点需要通过网络传输拉取各个节点上的磁盘文件中的相同Key。而且相同Key都拉取到同一个节点进行聚合操作时,还有可能会因为一个节点上处理的Key过多,导致内存不够,进而溢写到磁盘文件中。因此,在Shuffle过程中,可能会发生大量的磁盘文件读写的I/O操作,以及数据的网络传输操作。
如何判断是否发生数据倾斜
一般都通webui来查看
- 通