Hive SQL优化之 Count Distinct
2017-03-21 12:24
302 查看
Hive SQL优化之 Count Distinct
Hive是Hadoop的子项目,它提供了对数据的结构化管理和类SQL语言的查询功能。SQL的交互方式极大程度地降低了Hadoop生态环境中数据处理的门槛,用户不需要编写程序,通过SQL语句就可以对数据进行分析和处理。目前很多计算需求都可以由Hive来完成,极大程度地降低了开发成本。目前,Hive底层使用MapReduce作为实际计算框架,SQL的交互方式隐藏了大部分MapReduce的细节。这种细节的隐藏在带来便利性的同时,也对计算作业的调优带来了一定的难度。未经优化的SQL语句转化后的MapReduce作业,它的运行效率可能大大低于用户的预期。本文我们就来分析一个简单语句的优化过程。
日常统计场景中,我们经常会对一段时期内的字段进行消重并统计数量,SQL语句类似于
SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...; |
该语句转化为MapReduce作业后执行示意图如下,图中还列出了我们实验作业中Reduce阶段的数据规模:
由于引入了DISTINCT,因此在Map阶段无法利用combine对输出结果消重,必须将id作为Key输出,在Reduce阶段再对来自于不同Map Task、相同Key的结果进行消重,计入最终统计值。
我们看到作业运行时的Reduce Task个数为1,对于统计大数据量时,这会导致最终Map的全部输出由单个的ReduceTask处理。这唯一的Reduce Task需要Shuffle大量的数据,并且进行排序聚合等处理,这使得它成为整个作业的IO和运算瓶颈。
经过上述分析后,我们尝试显式地增大Reduce Task个数来提高Reduce阶段的并发,使每一个Reduce Task的数据处理量控制在2G左右。具体设置如下:
set mapred.reduce.tasks=100 |
Task,极少量的Map输出数据也不会使单一的Reduce Task成为瓶颈。改进后的SQL语句如下:
SELECT COUNT(*) FROM (SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t; |
从上述优化过程我们可以看出,一个简单的统计需求,如果不理解Hive和MapReduce的工作原理,它可能会比优化后的执行过程多四、五倍的时间。我们在利用Hive简化开发的同时,也要尽可能优化SQL语句,提升计算作业的执行效率。
注:文中测试环境Hive版本为0.9
相关文章推荐
- Hive SQL优化之 Count Distinct
- 【SQL优化】使用子查询可提升 COUNT DISTINCT
- SQL优化(二) 快速计算Distinct Count
- SqlZoo.net习题答案:Using SUM, COUNT, MAX, AVG, DISTINCT and ORDER BY.
- SQL(select distinct count)
- LINQ体验(5)--LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- LINQ to SQL学习 之Select/Distinct和Count/Sum/Min/Max/Avg
- LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- 一道看似简单的sql面试题(count,group by,distinct)
- LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- hive简介 安装 hivesql hive开发 性能优化
- LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- 关于HIVE的SELECT count(*) 优化
- 关于HIVE的SELECT count(*) 优化
- LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg - YJingLee's Blog - 博客园(转)
- LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg
- SQL Server distinct top count 查询
- 查询所有订单的最新信息的SQL语句的写法 DISTINCT配合count和group by一起完成