hive知识点

1. Hive 定义与原理

Hive 是基于 Hadoop 的离线数据仓库工具。 核心功能:将 HDFS 上的结构化文件映射为数据库表,提供类 SQL (HQL)
查询接口。 工作流程: 客户端连接 HiveServer2 (HS2) 并发送 SQL,HS2 完成身份认证与会话管理。 请求转发给
Driver,Driver 首先连接 Metastore 获取元数据。 依次进行 解析、编译、优化,生成最终的
物理执行计划(MR/Tez/Spark 任务)。 将任务提交给 YARN 调度启动。 计算完成后,结果暂存于 HDFS 临时目录,由
Driver 拉取并通过 HS2 返回给客户端展示。”

2. 数仓分层架构

“数据架构通常分为三层: ODS 层 (原始数据层):原样存储业务同步来的原始数据,保持数据面貌,不做修改。 DW 层
(数据仓库层):核心计算层。对 ODS 数据进行清洗、转换、规范化,并进行维度建模(细粒度明细 DWD + 聚合汇总 DWS)。 ADS 层
(数据应用层):结果输出层。面向具体业务指标,存储高度聚合的最终结果,直接服务于 BI 报表和大屏展示。
优点是:避免使用MR程序,减少开发时间,支持UDF和UDAF函数,灵活处理复杂逻辑。
缺点:高延迟,启动慢,基于hdfs,不支持随机读写,大量小文件会拖慢namenode性能和查询效率; 典型的用时间换空间;

函数:

1.内置函数: 普通函数:Rand():生成0-1之间的随机数。ABS():绝对值 聚合函数:count(),sum(),Avg(),min(),max();
窗口函数:row_number()即使数值相同,序号也依次递增。Rank()数值相同并列,留空位。dense_rank()数值相同并列,不留空位置;
2.自定义函数(UDF): UDF:UDF一进一出。(只是转换内容,行数不变) UDAF:聚集函数,多进一出,类似于:count/max/min。例如业务逻辑中需要百分位数的时候hive自定义函数不满足,可以使用自定义UDAF函数
UDTF:一进多出。例:统计数据库中一个字符串字段内容有多少个分类(美食旅游电影),group
by无法统计,需要使用udtd将结构炸开,变成多行。

数仓和数据库的区别:

数据库是面向事务的,支持处理大量的短查询增删改查操作,查询,执行速度快;存储方面一般是只保留最新数据,历史数据一般会归档或删除,
数据仓库:面向的是数据分析,复杂的查询和分析操作,查询慢。存储一般是存储全量历史数据。

Hive的分区和分桶:

分区:将数据按照分区不同存储到不同的目录下,本质上是在hdfs中创建子目录,分区针对的是数据的存储路径;通常是按照:日期、地区、类别创建分区;
分桶:分桶针对的是数据文件。 数据文件按照指定的字段,进行文件切割,形成不同的小文件进行存储;切割的依据是 Hash
取模保证相同字段值的数据一定在同一个桶里。

内部表和外部表:

内部表:未被external修饰的表,也叫管理表。删除表会删除表的元数据(metadata)和表数据。数据存储在HDFS上,内部表由Hive自身管理,元数据(metadata)都存储在mysql上,由mysql管理。使用场景一般是对原始数据或比较重要的中间数据进行建表存储。
外部表:被external修饰的表,外部表被drop后,表的元数据会被删除,但是数据不会被删除。如果不小心删掉外部表,重新建表location到数据存放在HDFS的相应路径即可。外部表数据由HDFS管理的。

hive数据倾斜问题,有什么解决⽅案?

Hive数据倾斜问题主要源于数据分布不均匀,导致部分Reducer负载过重,影响整体作业的执行效率。 原因分析:
Key分布不均匀:部分Key对应的数据量远大于其他Key,导致处理这些Key的Reducer工作量巨大。
业务数据特性:某些特定业务逻辑导致数据集中在特定的Key上。
SQL语句造成数据倾斜:错误的Join或分组条件可能导致大量数据集中到少数Reducer上。

解决方案:

  1. 参数调节 hive.map.aggr=true:在Map阶段进行局部聚合,减少向Reducer传输的数据量。 hive.groupby.skewindata=true:开启这个参数后,让 Hive 自动生成两个 Job 进行负载均衡。

  2. SQL语句调节 过滤空值:很多倾斜是因为大量的 NULL 值,直接在 WHERE 中过滤掉。 Map Join:对于大表和小表的Join,使用Map Join可以将小表加载到每个Mapper的内存中,减少数据通过网络传输。
    在进行Join操作时,选择分布较为均匀的字段作为Join Key,减少数据倾斜。

  3. 数据预处理 重分布数据:对倾斜的数据进行预处理,如添加随机前缀或后缀,使得数据更加均匀地分布到Reducer中。

调优:

Map端Join:MapJoin把小表全部加载到内存在map端进行join,避免reducer处理
SQL优化:Hive在读数据的时候,可以只读取查询中所需要用到的列,而忽略其他列。查询的过程中减少不必要的分区。
并行执行:默认情况下,Hive一次只会执行一个阶段,通过设置参数hive.exec.parallel值为true,就可以开启并发执行,将MapReduce阶段、抽样阶段、合并阶段、limit阶段,这些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。
严格模式:过设置属性set hive.mapred.mode =strict,开始严格模式,默认是不开启的。对于分区表,在where语句中必须含有分区字段作为过滤条件来限制范围,否则不允许执行。对于使用了order
by语句的查询,要求必须使用limit语句。限制笛卡尔积的查询。
jvm重用:一个 JVM 实例处理多个 Task(Map/Reduce),避免频繁启动/销毁 JVM的开销。mapred-site.xml配置文件中,mapreduce.job.jvm.numtasks去配置。10

hive的数据存储格式:

行存储的特点:
查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;

© 版权声明

相关文章