通过对单词计数步伐的分析,渴望可以大概让各人了解最根本的stage划分的原理,以及stage划分后shuffle操作是如何在两个stage的边界处实验的。然后我们就知道如何快速定位出发生数据倾斜的stage对应代码的哪一个部门了。比如我们在Spark Web UI大概当地log中发现,stage1的某几个task实验得特殊慢,判断stage1出现了数据倾斜,那么就可以回到代码中定位出stage1主要包括了reduceByKey这个shuffle类算子,此时根本就可以确定是由educeByKey算子导致的数据倾斜题目。比如某个单词出现了100万次,其他单词才出现10次,那么stage1的某个task就要处理100万数据,整个stage的速率就会被这个task拖慢。 六、某个task莫名其妙内存溢出的环境
这种环境下去定位出题目标代码就比力容易了。我们发起直接看yarn-client模式下当地log的异常栈,大概是通过YARN查看yarn-cluster模式下的log中的异常栈。一样平常来说,通过异常栈信息就可以定位到你的代码中哪一行发生了内存溢出。然后在那行代码附近找找,一样平常也会有shuffle类算子,此时很大概就是这个算子导致了数据倾斜。但是各人要注意的是,不能单纯靠偶尔的内存溢出就判断发生了数据倾斜。因为自己编写的代码的bug,以及偶尔出现的数据异常,也大概会导致内存溢出。因此照旧要按照上面所讲的方法,通过Spark Web UI查看报错的那个stage的各个task的运行时间以及分配的数据量,才气确定是否是由于数据倾斜才导致了这次内存溢出。 七、查看导致数据倾斜的key的数据分布环境