前言
在数据分析师/算法工程师/数仓研发工程师的日常工作中,Hadoop(包括Hive,HDFS等组件)绝对是不可或缺的数据处理平台,虽然大数据集群和分布式并行计算提高了数据的查询效率,但相信大家也没少遇到任务卡在99%死活跑不出来的时候。所以,知其然,更要知其所以然,在本篇和下篇文章中,我们将通过对Hadoop分布式计算特性进行进一步探究,针对实际工作中遇到的Hive性能问题(特别是数据倾斜)进行对症下药的解决。
(注:阅读本文之前需要对Hadoop中的Mapreduce并行计算框架有一定的了解,知道并使用过HiveSQL)
一、分布式计算存在的问题
首先我们需要知道,在Hadoop分布式计算框架下会衍生哪些问题:
- 数据量大不是负载重点,但「数据倾斜」会产生很多麻烦
所谓的「数据倾斜」,用通俗的话来讲,就是“一个人累死,其他人闲死”,在MapReduce程序中,大量的相同key被partition分配到一个分区里,使这个节点承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,这样一来也拖累了整体的计算时间,使数据的生产效率十分低下。
- jobs数比较多的作业运行效率相对比较低,原因是mapreduce作业初始化的时间是比较长的
即使只有几百行的表,如果进行多次关联多次汇总,产生十几个jobs,同样会耗时很长
- count(distinct...)在数据量大的情况下,效率较低