大数据面试题:Hive count(distinct)有几个reduce,海量数据会有什么问题

本文涉及的产品
大数据开发治理平台 DataWorks,不限时长
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: count(distinct)只有1个reduce。为什么只有一个reducer呢,因为使用了distinct和count(full aggreates),这两个函数产生的mr作业只会产生一个reducer,而且哪怕显式指定set mapred.reduce.tasks=100000也是没用的。当使用count(distinct)处理海量数据(比如达到一亿以上)时,会使得运行速度变得很慢,熟悉mr原理的就明白这时sql跑的慢的原因,因为出现了很严重的数据倾斜。

参考答案:

count(distinct)只有1个reduce。

为什么只有一个reducer呢,因为使用了distinct和count(full aggreates),这两个函数产生的mr作业只会产生一个reducer,而且哪怕显式指定set mapred.reduce.tasks=100000也是没用的。

当使用count(distinct)处理海量数据(比如达到一亿以上)时,会使得运行速度变得很慢,熟悉mr原理的就明白这时sql跑的慢的原因,因为出现了很严重的数据倾斜。

案例分析:

做去重统计时,一般都这么写:

select

 count(distinct (bill_no)) as visit_users

from

 i_usoc_user_info_d

where

 p_day = '20210508'

 and bill_no isnotnull

 and bill_no != ''

其实看起来,这没有任务毛病,但我们需要注意的是,此时写的是hql,它的底层引擎是MapReduce,是分布式计算的,所以就会出现数据倾斜这种分布式计算的典型问题,比如上面的使用数仓中一张沉淀了所有用户信息的融合模型来统计所有的手机号码的个数,这种写法肯定是能跑出结果的,但运行时长可能就会有点长。

我们去查下,就会发现记录数至少上亿,去hdfs中查看文件会发现这个分区很大,并且此时,我们通过查看执行计划和日志可以发现只有一个stage。也就是说最后只有一个reduce。

熟悉mr原理的已经明白了这条sql跑的慢的原因,因为出现了很严重的数据倾斜,几百个mapper,1个reducer,所有的数据在mapper处理过后全部只流向了一个reducer,逻辑计划大概如下:

为什么只有一个reducer呢,因为使用了distinct和count(full aggreates),这两个函数产生的mr作业只会产生一个reducer,而且哪怕显式指定set mapred.reduce.tasks=100000也是没用的。

所以对于这种去重统计,如果在数据量够大,一般是一亿记录数以上(视公司的集群规模,计算能力而定),建议选择使用count加group by去进行统计:

select

 count(a.bill_no)

from

 (

   select

     bill_no

   from

     dwfu_hive_db.i_usoc_user_info_d

   where

     p_day = '20200408'

     and bill_no isnotnull

     and bill_no != ''

   groupby

     bill_no

 ) a

这时候再测试,会发现速度会快很多,查看执行计划和日志,会发现启动了多个stage,也就是多个mr作业,这是因为引入了group by将数据分组到了多个reducer上进行处理。逻辑执行图大致如下:

总结:在数据量很大的情况下,使用count+group by替换count(distinct)能使作业执行效率和速度得到很大的提升,一般来说数据量越大提升效果越明显。

注意:开发前最好核查数据量,别什么几万条几十万条几十M数据去重统计就count加groupby就咔咔往上写,最后发现速度根本没有直接count(distinct)快,作业还没起起来人家count(distinct)就完事结果出来了,所以优化还得建立在一个数据量的问题上,这也是跟其他sql的区别。


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
3月前
|
SQL 前端开发 程序员
【面试题】前端开发中如何高效渲染大数据量?
【面试题】前端开发中如何高效渲染大数据量?
107 0
|
3月前
|
设计模式 SQL 算法
大数据面试总结
大数据面试总结
59 0
|
18天前
|
安全 关系型数据库 MySQL
|
2月前
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
3月前
|
分布式计算 监控 大数据
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
63 1
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
|
2月前
|
存储 NoSQL 大数据
【大数据】LSM树,专为海量数据读写而生的数据结构
【大数据】LSM树,专为海量数据读写而生的数据结构
31 0
|
2月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之如何增加Reduce任务的个数
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
3月前
|
关系型数据库 分布式数据库 数据处理
【PolarDB 开源】PolarDB 在大数据分析中的应用:海量数据处理方案
【5月更文挑战第25天】PolarDB是解决大数据挑战的关键技术,以其高性能和可扩展性处理大规模数据。通过与数据采集和分析工具集成,构建高效数据生态系统。示例代码显示了PolarDB如何用于查询海量数据。优化策略包括数据分区、索引、压缩和分布式部署,广泛应用于电商、金融等领域,助力企业进行精准分析和决策。随着大数据技术进步,PolarDB将继续发挥关键作用,创造更多价值。
195 0
|
3月前
|
SQL 分布式计算 算法
程序员必备的面试技巧——大数据工程师面试必备技能
程序员必备的面试技巧——大数据工程师面试必备技能
81 0
|
3月前
|
缓存 运维 NoSQL
面试分享:Redis在大数据环境下的缓存策略与实践
【4月更文挑战第10天】探索Redis在大数据缓存的关键作用,本文分享面试经验及必备知识点。聚焦Redis数据结构(String、List、Set、Hash、Sorted Set)及其适用场景,缓存策略(LRU、LFU、TTL)与过期机制,集群和数据分片,以及性能优化和运维技巧。通过代码示例深入理解,助你面试成功,构建高效缓存服务。
107 4

相关产品

  • 云原生大数据计算服务 MaxCompute