数据倾斜
数据倾斜是指,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。
表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。
问题
类型 |
关键词 |
情形 |
后果 |
解决方法 |
数据倾斜 |
Join |
其中一个表是小表(1000条以下记录或1G容量以下)
|
分发到某几个reduce上的数据远高于平均值 |
SMB Join, Map Join, SMB Map Join |
数据倾斜 |
|
大表与大表join,但是关联值0或null过多 |
空值会由一个reduce处理,非常慢 |
SMB Join, 空值特殊处理, 调参(skewjoin) |
数据倾斜 |
|
小表不小不大 |
- |
嵌套Map Join |
数据倾斜 |
|
不同数据类型关联 |
默认的Hash操作会按int型的id来进行分配,所有string类型id的记录都分配到一个Reducer中 |
类型转换 |
数据倾斜 |
Group by |
某些维度值数据过多 |
处理某值的reduce耗时 |
调参(skewindata) |