Hive 高频面试题及详细答案(实战完整版)_第1页
Hive 高频面试题及详细答案(实战完整版)_第2页
Hive 高频面试题及详细答案(实战完整版)_第3页
Hive 高频面试题及详细答案(实战完整版)_第4页
Hive 高频面试题及详细答案(实战完整版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hive高频面试题及详细答案(实战完整版)一、基础概念类1、简单说下Hive是什么,它的核心作用是什么?Hive是基于Hadoop的数据仓库工具,底层依托HDFS存储数据、MapReduce/Tez/Spark执行计算。它可以把结构化的SQL语句,自动翻译成分布式计算任务,让不懂Java大数据开发的人员,也能通过SQL快速处理海量离线数据。核心作用:主要用于离线海量数据清洗、统计分析、数仓建模、报表统计,不适合实时、低延迟的查询场景。2、Hive和MySQL的核心区别?很多人会把两者混淆,但底层架构和使用场景完全不同,核心差异如下:存储层面:MySQL数据存在本地磁盘;Hive数据存在HDFS分布式文件系统。计算层面:MySQL是单机计算;Hive是分布式集群计算,可支撑TB、PB级数据。延迟场景:MySQL低延迟,支持实时查询;Hive高延迟,只适合离线批量计算。事务支持:MySQL完整支持事务、行级锁;Hive早期无事务,新版本仅支持有限事务,多用于分区级操作,基本不用于事务业务。索引能力:MySQL索引高效;Hive索引基本废弃,生产靠分区、分桶、优化SQL提升效率。3、Hive的数据库、表、数据分别存在哪里?元数据包含什么?Hive分为元数据和真实业务数据两部分:真实数据:全部存储在HDFS上,默认路径/user/hive/warehouse/。元数据:存储在MySQL、PostgreSQL等关系型数据库中,默认derby仅适合测试,生产全部改用MySQL。元数据核心包含:库名、表名、字段信息、分区信息、分桶规则、数据存储路径、文件格式、序列化方式等。简单说,Hive只存“表结构信息”,真实数据全在HDFS。4、Hive内部表和外部表的区别?生产如何选择?内部表(管理表):Hive全权管理表数据和元数据,删除表时,元数据和HDFS上的真实数据会一起被删除。外部表:Hive仅管理元数据,真实数据由用户自己管理。删除外部表时,仅删除元数据,HDFS原始数据完全保留,不会丢失。生产选型原则:原始日志、上游同步数据、多任务共用数据:一律用外部表,防止误删数据。中间计算结果、临时表、清洗后独立结果数据:可用内部表。5、Hive分区表的原理和作用?常见分区类型?分区本质是文件夹级别的数据拆分。Hive会根据分区字段,把不同条件的数据存到HDFS不同子文件夹下。查询时可以通过分区过滤,只扫描指定文件夹数据,不用全表扫描,大幅提升查询效率。常见分区类型:静态分区:手动指定分区值,适合批量固定数据导入。动态分区:根据原始数据字段自动生成分区,适合每日增量数据同步,生产使用最多。多级分区:常用年-月-日、地区-日期多级分区,细化数据粒度。注意:分区字段不能和表内业务字段重复,会造成数据冗余。6、Hive分桶表的原理、作用,和分区的区别?分桶是文件级别的数据拆分,通过对分桶字段取哈希值,对桶个数取模,把数据均匀分散到指定数量的文件中。核心作用:提升抽样查询效率;优化大表join性能,相同key数据在同一桶内,减少跨桶关联;让数据分布更均匀,避免数据集中少数文件。分区和分桶核心区别:分区是文件夹拆分,粒度大;分桶是文件拆分,粒度更细。分区用于大范围数据过滤;分桶用于精准关联、抽样、数据均匀分布。一张表可以同时设置分区+分桶,生产常用分区表嵌套分桶。二、Hive数据存储与文件格式1、Hive常用文件格式对比:TextFile、SequenceFile、ORC、Parquet(1)TextFile默认文本格式,可读性高,支持直接查看,无压缩。缺点是磁盘占用大、查询解析慢,生产禁止长期使用,仅用于临时原始数据落地。(2)SequenceFileHadoop二进制文件格式,支持压缩,键值对存储。目前基本被ORC、Parquet替代,极少使用。(3)ORCHive专属优化列式存储格式,压缩率极高、查询速度快、支持索引、支持事务,Hive数仓分层建模首选格式。(4)Parquet通用列式存储格式,跨Spark、Flink、Hive兼容好,压缩和查询性能优秀,多引擎协作的数仓优先使用。2、列式存储和行式存储的区别?为什么数仓优先列式?行式存储:一行数据完整存储在一起,适合整行数据查询、增删改业务,适合事务型数据库。列式存储:同一字段数据集中存储,数仓分析场景大多是只查部分字段、全量统计,列式存储只需读取指定列数据,无需扫描全表所有字段,压缩率更高、IO更少、速度更快。三、Hive核心运行原理1、HiveSQL的执行流程?完整执行链路非常固定,面试必背:客户端提交HiveSQL到Driver驱动器;解析器(Parser)对SQL做语法解析,生成抽象语法树AST;语义分析器校验表、字段、权限,从元数据数据库读取表结构信息;优化器对SQL做逻辑优化、谓词下推、裁剪列、合并任务等;编译器将优化后的逻辑计划,翻译成MapReduce/Spark/Tez分布式任务;执行器提交任务到YARN集群运行,读取HDFS数据计算;最终将结果返回客户端展示。2、Hive中Map和Reduce阶段分别做什么?Map阶段:读取HDFS分片数据,完成数据过滤、字段裁剪、简单转换、分组预处理,是并行分布式执行的阶段。Reduce阶段:接收Map端输出的数据,完成全局分组、聚合、排序、join关联,最终输出结果写入HDFS。简单总结:Map做局部处理,Reduce做全局汇总。3、Hive为什么不支持实时查询?核心原因是底层依赖Hadoop离线计算架构:每次查询需要启动集群任务、申请资源、调度任务,启动耗时高;HDFS适合批量读写,随机读写性能极差;MapReduce任务调度机制本身就是为离线批量场景设计。实时场景一般用Spark、Flink替代Hive。四、数据倾斜问题(面试重中之重)1、什么是Hive数据倾斜?产生原因?数据倾斜就是任务数据分布不均匀。大部分Reduce任务几秒跑完,个别Reduce任务数据量超大、执行极慢,导致整个任务卡在最后一个节点,整体耗时翻倍。常见产生原因:join关联字段存在大量null值、空字符串;某几个key的数据量远超其他key,比如热门用户、热门商品;分组统计时,单一维度数据量过度集中。2、数据倾斜的解决方案(生产实战方案)(1)空值、无效值倾斜对null、空字符串做随机打散处理,不让无效数据扎堆同一个reduce:

nvl(user_id,concat('rand_',rand()))(2)大key热点倾斜拆分冷热数据:热点大key单独查询,普通key正常关联,最后合并结果;或者对热点key加随机前缀打散,分段计算后再聚合。(3)开启倾斜参数优化生产常用参数:hive.groupby.skewindata=true(分组倾斜优化)hive.optimize.skewjoin=true(join倾斜优化)(4)mapjoin替代普通join小表广播到大表所有map节点,省略reduce阶段,彻底规避reduce倾斜问题。3、MapJoin原理和使用场景?原理:把小表数据全部加载到内存,在Map阶段直接和大表分片数据做关联,不需要走Reduce阶段,省去shuffle数据传输,速度极快。使用场景:一大一小表关联,小表数据量较小(默认25M以内,可参数调整)。注意:两张大表绝对不能用mapjoin,会造成内存溢出。五、HiveSQL优化实战1、日常开发最常用的Hive优化手段?分区过滤优先:查询必须带分区条件,禁止全表扫描;谓词下推:尽早过滤数据,减少后续计算数据量;列裁剪:只查询需要的字段,禁止select*;大表join小表,优先使用mapjoin;避免重复计算:复杂逻辑用with语句、临时表复用结果;开启任务并行,合理设置reduce个数;数据倾斜专项优化。2、为什么要避免select*?列式存储格式下,select*会读取所有列数据,增加磁盘IO、内存占用和网络传输量,大幅降低查询速度。只读取业务需要的字段,能极大提升执行效率。同时也能避免读取废弃字段,减少数据冗余。3、Hive中orderby、sortby、distributeby、clusterby的区别?orderby:全局有序,只有一个reduce,数据量大时极慢,慎用;sortby:单个reduce内部有序,全局无序,执行效率高;distributeby:指定数据分发规则,相同key发到同一个reduce,常配合sortby使用;clusterby:等价于distributeby+sortby,既能分区分发又能局部排序。4、unionall和union的区别?生产用哪个?union会去重、排序,需要额外开启reduce任务,性能极差;unionall直接拼接结果,不做去重和排序,性能极高。生产一律优先使用unionall,业务需要去重时,单独使用distinct或groupby处理,不使用union。六、Hive数仓建模与分层1、简述数仓分层架构(ODS、DWD、DWS、ADS)生产通用四层架构,Hive数仓基本全部沿用:ODS原始层:同步上游日志、业务库原始数据,不做清洗,保留完整原始数据,全部外部表。DWD明细层:对ODS数据清洗、去重、补缺失、字段标准化,保留最细粒度明细数据。DWS聚合层:按日、按用户、按商品等维度,做轻度聚合,汇总常用指标。ADS应用层:面向报表、大屏、业务查询,生成最终业务指标结果,数据轻量化。2、分层的核心意义?解耦数据,避免原始数据变更影响上层指标;数据复用,一次清洗多次使用,减少重复计算;问题溯源,分层定位数据异常问题;降低计算压力,提升任务稳定性。七、日常报错与问题排查1、Hive任务常见报错及解决(1)内存溢出OOM原因:单任务处理数据过多、大key倾斜、小表过大触发mapjoin内存不足。

解决:调整map/reduce内存参数、优化数据倾斜、拆分大任务、限制mapjoin表大小。(2)分区不存在、数据找不到原因:分区字段写错、分区未生成、数据导入失败。

解决:修复分区、刷新元数据、检查调度任务执行日志。(3)元数据不一致原因:手动操作HDFS文件、删除文件夹导致元数据和真实数据不匹配。

解决:msckrepairtable修复分区、刷新表元数据。2、msckrepair命令的作用?用于修复分区表元数据。如果手动在HDFS创建、删除分区文件夹,Hive元数据不会自动同步,执行该命令可以自动扫描HDFS目录,同步新增、删除对应的分区信息,修复元数据一致性问题。八、高阶面试题1、Hive动态分区注意事项?必须开启动态分区参数:hive.exec.dynamic.partition=true;生产一般设置非严格模式:hive.exec.dynamic.partition.mode=nonstrict;动态分区字段必须放在查询字段最后;控制动态分区最大数量,避免一次性生成大量小文件。2、Hive小文件问题的危害和解决方案?危害:HDFS存储小文件过多,会占用大量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论