常见会产生数据倾斜的框架: hadoop,hive,hbase,flink,spark,sqoop,以及各种Shuffle阶段
一、对于数据倾斜的定义 1.是什么: 在shuffle过程中大量同一key的数据被分配至同一分区,导致其中一节点压力过大,而其他节点过于清闲的情况。 2.现象: ①绝大多数map Task运行快速,而个别Task,尤其多见于reduce task运行过慢。 ②OOM(Hadoop——container,Spark——driver) 3.原理: 进行Shuffle的过程中将相同的key的数据拉取到某个reduce Task节点上进行处理,而相同key下数据量过大。
二、解决思路 1.增加JVM 2.指定分区策略 3.重新设计key
三、具体措施 1.排查空值问题:多见于爬取数据时网站设防,爬取到大量空数据。若同一key中存在大量null值则选择剔除空值、或对其进行打散的操作。 2.设置负载均衡,set hive.groupby.skewindata = true;//底层将其转为多job关联模式 3.检查类型是否需要强转:最新版本的hive中会对类型进行默认强转操作,但若hive版本较老,则需要手动使用cast强转。 4.SQL优化:①使用group by 代替distinct group ②mapjoin, 在map阶段进行提前聚合,降低reduce阶段Shuffle量。
PS:网上存在一些通过更改reduce Task个数来尝试解决数据倾斜问题的,但这种操作本质上不可取。因为reduce阶段的操作都是task从所有mapTask中拉取运算结果进行计算,reduceTask相互不存在并行执行同一任务的关系。每个reduceTask单独计算全部任务,故无效。
|