1.数据倾斜是什么?
由于数据分布不均匀,造成数据大量集中到一台或者多台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。
产生数据倾斜,有什么表现?
-
在使用Hive算数据的时候,reduce阶段卡在99.99%,不能结束。
-
查看日志或者监控界面,会发现:
有一个或多个reduce卡住 各种container报错OOM 读写的数据量极大,至少远远超过其他正常的reduce 伴随着数据倾斜,会出现任务被kill等各种诡异的表现
2.数据倾斜的原因?
- key分布不均匀
- 业务数据本身的特性
- 建表时考虑不周
- 某些SQL语句就有数据倾斜
数据倾斜的原理
-
数据倾斜产生的原因
我们在做数据运算的时候,count、distinct、group by、join等操作,这些操作都会触发shuffle动作,一旦触发,所有相同的key的值就会拉到一个或者几个节点上,就容易发生单点问题。 -
万恶的shuffle
如下图所示,因为数据分布不均匀,导致大量的数据分配到一个节点。
-
从业务角度去理解数据倾斜
数据与业务紧密相关,业务的场景直接影响到了数据的分布。再举一个例子,比如就说订单场景吧,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。
3.如何解决数据倾斜问题?
3.1参数调节
-
hive.map.aggr=true
Map 端部分聚合,相当于Combiner(在reduce前,进行一次规约,减少在网络中传输速度) -
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;
第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
3.2SQL语句调节
- 如何Join:
- group by维度过小:
- 特殊情况特殊处理:
3.3业务逻辑
-
有损方法:
将找到异常数据,比如ip为0的数据,过滤掉 -
无损方法:
将(分布不均匀的数据单独计算)北京、上海两地数据单独处理,然后再将处理后的结果汇总到一起。
先对key做一层hash,先将数据打散让它并行度变大,再汇集。 -
数据预处理