Hive面经

hive原理

  • Hive 内部表和外部表的区别
  • Hive 有索引吗
  • 运维如何对 Hive 进行调度
  • ORC、Parquet 等列式存储的优点
  • 数据建模用的哪些模型?
    • 1. 星型模型
    • 2. 雪花模型
    • 3. 星座模型
  • 为什么要对数据仓库分层?
  • 使用过 Hive 解析 JSON 串吗
  • sort by 和 order by 的区别
  • 数据倾斜怎么解决
  • Hive 小文件过多怎么解决
    • 1. 使用 hive 自带的 concatenate 命令,自动合并小文件
    • 2. 调整参数减少 Map 数量
    • 3.减少 Reduce 的数量
    • 4. 使用 hadoop 的 archive 将小文件归档
  • Hive 优化有哪些
  • Tez 引擎优点?

Hive 内部表和外部表的区别

未被 external 修饰的是内部表,被 external 修饰的为外部表。
区别:

  1. 内部表数据由 Hive 自身管理,外部表数据由 HDFS 管理;
  2. 内部表数据存储的位置是 hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive 将在 HDFS 上的/user/hive/warehouse 文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
  3. 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS 上的文件并不会被删除。

Hive 有索引吗

Hive 支持索引(3.0 版本之前),但是 Hive 的索引与关系型数据库中的索引并不相同,比如,Hive 不支持主键或者外键。并且 Hive 索引提供的功能很有限,效率也并不高,因此 Hive 索引很少使用。
 索引适用的场景:适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。
 Hive 索引的机制如下:hive 在指定列上建立索引,会产生一张索引表(Hive 的一张物理表),里面的字段包括:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。
Hive 0.8 版本后引入 bitmap 索引处理器,这个处理器适用于去重后,值较少的列
(例如,某字段的取值只可能是几个枚举值) 因为索引是用空间换时间,索引列的取值过多会导致建立 bitmap 索引表过大。注意:Hive 中每次有数据时需要及时更新索引,相当于重建一个新表,否则会影响数据查询的效率和准确性,Hive 官方文档已经明确表示 Hive 的索引不推荐被使
用,在新版本的 Hive 中已经被废弃了。
扩展:Hive 是在 0.7 版本之后支持索引的,在 0.8 版本后引入 bitmap 索引处理器,在 3.0 版本开始移除索引的功能,取而代之的是 2.3 版本开始的物化视图,自动重写的物化视图替代了索引的功能。

运维如何对 Hive 进行调度

  1. 将 hive 的 sql 定义在脚本当中;
  2. 使用 azkaban 或者 oozie 进行任务的调度;
  3. 监控任务调度页面。

ORC、Parquet 等列式存储的优点

ORC 和 Parquet 都是高性能的存储方式,这两种存储格式总会带来存储和性能上的提升。

Parquet:

  1. Parquet 支持嵌套的数据模型,类似于 Protocol Buffers,每一个数据模型的schema 包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名。重复次数可以是以下三种:required(只出现 1 次),repeated(出现 0 次或多次),optional(出现 0 次或 1 次)。每一个字段的数据类型可以分成两种:group(复杂类型)和 primitive(基本类型)。
  2. Parquet 中没有 Map、Array 这样的复杂数据结构,但是可以通过 repeated和 group 组合来实现的。
  3. 由于 Parquet 支持的数据模型比较松散,可能一条记录中存在比较深的嵌套关系,如果为每一条记录都维护一个类似的树状结可能会占用较大的存储空间,因此 Dremel 论文中提出了一种高效的对于嵌套数据格式的压缩算法:Striping/Assembly 算法。通过 Striping/Assembly 算法,parquet 可以使用较少的存储空间表示复杂的嵌套格式,并且通常 Repetition level 和Definition level 都是较小的整数值,可以通过 RLE 算法对其进行压缩,进一步降低存储空间。
  4. Parquet 文件是以二进制方式存储的,是不可以直接读取和修改的,Parquet文件是自解析的,文件中包括该文件的数据和元数据。

ORC:

  1. ORC 文件是自描述的,它的元数据使用 Protocol Buffers 序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗。
  2. 和 Parquet 类似,ORC 文件也是以二进制方式存储的,所以是不可以直接读取,ORC 文件也是自解析的,它包含许多的元数据,这些元数据都是同构 ProtoBuffer 进行序列化的。
  3. ORC 会尽可能合并多个离散的区间尽可能的减少 I/O 次数。
  4. ORC 中使用了更加精确的索引信息,使得在读取数据时可以指定从任意一行开始读取,更细粒度的统计信息使得读取 ORC 文件跳过整个 rowgroup,ORC 默认会对任何一块数据和索引信息使用 ZLIB 压缩,因此 ORC文件占用的存储空间也更小。
  5. 在新版本的 ORC 中也加入了对 Bloom Filter 的支持,它可以进一 步提升谓词下推的效率,在 Hive 1.2.0 版本以后也加入了对此的支 持。

数据建模用的哪些模型?

1. 星型模型

在这里插入图片描述
星形模式(Star Schema)是最常用的维度建模方式。星型模式是以事实表为中心,所有的维度表直接连接在事实表上,像星星一样。 星形模式的维度建模由一个事实表和一组维表成,且具有以下特点:
a. 维表只和事实表关联,维表之间没有关联;
b. 每个维表主键为单列,且该主键放置在事实表中,作为两边连接的外键;
c. 以事实表为核心,维表围绕核心呈星形分布。

2. 雪花模型

在这里插入图片描述
雪花模式(Snowflake Schema)是对星形模式的扩展。雪花模式的维度表可以拥有其他维度表的,虽然这种模型相比星型更规范一些,但是由于这种模型不太容易理解,维护成本比较高,而且性能方面需要关联多层维表,性能比星型模型要低。

3. 星座模型

在这里插入图片描述
星座模式是星型模式延伸而来,星型模式是基于一张事实表的,而星座模式是基于多张事实表的,而且共享维度信息。前面介绍的两种维度建模方法都是多维表对应单事实表,但在很多时候维度空间内的事实表不止一个,而一个维表也可能被多个事实表用到。在业务发展后期,绝大部分维度建模都采用的是星座模式。数仓建模详细介绍可查看:通俗易懂数仓建模

为什么要对数据仓库分层?

 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。
 如果不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
 通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。
链接: 万字详解整个数据仓库建设体系(好文值得收藏)

使用过 Hive 解析 JSON 串吗

Hive 处理 json 数据总体来说有两个方向的路走:

  1. 将 json 以字符串的方式整个入 Hive 表,然后通过使用 UDF 函数解析已经导入到 hive 中的数据,比如使用 LATERAL VIEW json_tuple 的方法,获取所需要的列名。
  2. 在导入之前将 json 拆成各个字段,导入 Hive 表的数据是已经解析过的。这将需要使用第三方的 SerDe。
    链接: 一文学会Hive解析Json数组(好文收藏)

sort by 和 order by 的区别

order by 会对输入做全局排序,因此只有一个 reducer(多个 reducer 无法保证全局有序)只有一个 reducer,会导致当输入规模较大时,需要较长的计算时间。sort by 不是全局排序,其在数据进入 reducer 前完成排序. 因此,如果用 sort by进行排序,并且设置 mapred.reduce.tasks>1, 则sort by 只保证每个 reducer 的输出有序,不保证全局有序。

数据倾斜怎么解决

数据倾斜问题主要有以下几种:

  1. 空值引发的数据倾斜
  2. 不同数据类型引发的数据倾斜
  3. 不可拆分大文件引发的数据倾斜
  4. 数据膨胀引发的数据倾斜
  5. 表连接时引发的数据倾斜
  6. 确实无法减少数据量引发的数据倾斜
    以上倾斜问题的具体解决方案可查看:
    链接: Hive 千亿级数据倾斜解决方案
    注意:对于 left join 或者 right join 来说,不会对关联的字段自动去除 null 值,对于 inner join 来说,会对关联的字段自动去除 null 值。

Hive 小文件过多怎么解决

1. 使用 hive 自带的 concatenate 命令,自动合并小文件

使用方法:
#对于非分区表
alter table A concatenate;
#对于分区表
alter table B partition(day=20201224) concatenate;
注意:
1、concatenate 命令只支持 RCFILE 和 ORC 文件类型。
2、使用 concatenate 命令合并小文件时不能指定合并后的文件数量,但可以多次执行该命令。
3、当多次使用 concatenate 后文件数量不在变化,这个跟参数
mapreduce.input.fileinputformat.split.minsize=256mb 的设置有关,可设定每个文件的最小 size。

2. 调整参数减少 Map 数量

设置 map 输入合并小文件的相关参数(执行 Map 前进行小文件合并):
在 mapper 中将多个文件合成一个 split 作为输入(CombineHiveInputFormat 底层是 Hadoop 的 CombineFileInputFormat 方法):
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; – 默认

每个 Map 最大输入大小(这个值决定了合并后文件的数量)
set mapred.max.split.size=256000000; – 256M

一个节点上 split 的至少大小(这个值决定了多个 DataNode 上的文件是否需要合并):
set mapred.min.split.size.per.node=100000000; – 100M

一个交换机下 split的至少大小(这个值决定了多个交换机上的文件是否需要合并):
set mapred.min.split.size.per.rack=100000000; – 100M

3.减少 Reduce 的数量

reduce 的个数决定了输出的文件的个数,所以可以调整 reduce 的个数控制 hive表的文件数量。
hive 中的分区函数 distribute by 正好是控制 MR 中 partition 分区的,可以通过设置 reduce 的数量,结合分区函数让数据均衡的进入每个 reduce 即可:

#设置 reduce 的数量有两种方式,第一种是直接设置 reduce 个数
set mapreduce.job.reduces=10;

#第二种是设置每个 reduce 的大小,Hive 会根据数据总大小猜测确定一个 reduce 个数
set hive.exec.reducers.bytes.per.reducer=5120000000; – 默认是 1G,设置为 5G

#执行以下语句,将数据均衡的分配到 reduce 中
set mapreduce.job.reduces=10;
insert overwrite table A partition(dt)
select * from B
distribute by rand();
对于上述语句解释:如设置 reduce 数量为 10,使用 rand(),随机生成一个数 x %10 , 这样数据就会随机进入 reduce 中,防止出现有的文件过大或过小。

4. 使用 hadoop 的 archive 将小文件归档

Hadoop Archive 简称 HAR,是一个高效地将小文件放入 HDFS 块中的文件存档工具,它能够将多个小文件打包成一个 HAR 文件,这样在减少 namenode 内存使用的同时,仍然允许对文件进行透明的访问。

#用来控制归档是否可用
set hive.archive.enabled=true;

#通知 Hive 在创建归档时是否可以设置父目录
set hive.archive.har.parentdir.settable=true;

#控制需要归档文件的大小
set har.partfile.size=1099511627776;

使用以下命令进行归档:
ALTER TABLE A ARCHIVE PARTITION(dt=‘2021-05-07’, hr=‘12’);

对已归档的分区恢复为原文件:
ALTER TABLE A UNARCHIVE PARTITION(dt=‘2021-05-07’, hr=‘12’);

注意: 归档的分区可以查看不能 insert overwrite,必须先 unarchive
链接: 解决 hive 小文件过多问题

Hive 优化有哪些

  1. 数据存储及压缩:
    针对 hive 中表的存储格式通常有 orc 和 parquet,压缩格式一般使用 snappy。相比与 textfile 格式表,orc 占有更少的存储。因为 hive 底层使用 MR 计算架构,数据流是 hdfs 到磁盘再到 hdfs,而且会有很多次,所以使用 orc 数据格式和 snappy压缩策略可以降低 IO 读写,还能降低网络传输量,这样在一定程度上可以节省存储,还能提升 hql 任务执行效率;

  2. 通过调参优化:
    并行执行,调节 parallel 参数;
    调节 jvm 参数,重用 jvm;
    设置 map、reduce 的参数;开启 strict mode 模式;
    关闭推测执行设置。

  3. 有效地减小数据集将大表拆分成子表;结合使用外部表和分区表。

  4. SQL 优化
     大表对大表:尽量减少数据集,可以通过分区表,避免扫描全表或者全字
    段;
     大表对小表:设置自动识别小表,将小表放入内存中去执行。
    链接: Hive企业级性能优化(好文建议收藏)

Tez 引擎优点?

Tez 可以将多个有依赖的作业转换为一个作业,这样只需写一次 HDFS,且中间节点较少,从而大大提升作业的计算性能。

Mr/tez/spark 区别:
Mr 引擎:多 job 串联,基于磁盘,落盘的地方比较多。虽然慢,但一定能跑出结果。一般处理,周、月、年指标。

Spark 引擎:虽然在 Shuffle 过程中也落盘,但是并不是所有算子都需要 Shuffle,尤其是多算子过程,中间过程不落盘 DAG 有向无环图。 兼顾了可靠性和效率。一般处理天指标。

Tez 引擎:完全基于内存。 注意:如果数据量特别大,慎重使用。容易 OOM。
一般用于快速出结果,数据量比较小的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记之《机器与人》:AI如何重构工作方式和流程?

《机器与人: 埃森哲论新人工智能》作者是【美】保罗•多尔蒂和詹姆斯•威尔逊 ,原作名: Human Machine: Reimagining Work in the Age of AI,2018年出版。 保罗•多尔蒂(PAUL DAUGHERTYH):埃森哲首席技术官和创新官、…

策略迭代和价值迭代

策略迭代价值迭代 策略迭代(Policy Iteration)基本步骤例子:公主的营救 价值迭代(Value Iteration)基本步骤例子:公主的营救 策略迭代与价值迭代的区别实现方式目标收敛速度与其他技术的交互 策略迭代&…

浅谈Redis 的 保护模式(protected-mode)

今天在一台服务器上面部署了redis,发现始终无法用工具远程连接,项目里面是正常的,就是工具不行,防火墙也关闭了.折腾了一会才突然想起来,是不是触发了保护模式. 什么时候触发保护模式protected-mode: 同时满足以下两个: 1.bind未指定ip 2.未配置密码 解决方案: 编辑redis…

Room+ViewModel+LiveData

Room框架支持的LiveData会自动监听数据库的变化,当数据库发生变化的时候,会调用onChanged函数更新UI 1.MainActivity package com.tiger.room2;import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.vie…

红帽认证RHCE好考吗?多长时间能考下来?报名费多少一门?哪些人适合考红帽认证?

一、红帽认证等级 红帽认证考试有三个等级,分别是RHCSA(红帽认证系统管理员),RHCE(红帽认证工程师),RHCA(红帽认证架构师)。RHCA是最高级别的认证。 二、RHCE考试 1、考…

一款好用的AI工具——边界AICHAT(二)

目录 3.11、AI智能在线抠图3.12、AI智能图片增强放大3.13、AI图片擦除3.14、AI图片理解3.15、音频视频网页理解模型3.16、角色扮演3.17、AI文档理解对话3.18、公文写作模式3.19、插件库3.20、AI思维导图3.21、PPT一键生成3.22、音视频生成PPT 本篇博文接上一篇博文 一款好用的…

Singularity(四)| 自定义容器

Singularity(四)| 自定义容器 4.1 Singularity Definition 文件 对于可复制的、高质量的容器,我们应该使用定义文件(Definition File)构建 Singularity 容器 。使用定义文件的方式可以在纯文本文件中描述容器的配置和…

数据集踩的坑及解决方案汇总

数据集踩的坑及解决方案汇总 数据集各种格式构建并训练自己的数据集汇总Yolo系列SSDMask R-CNN报错 NotADirectoryError: [Errno 20] Not a directory: /Users/mia/Desktop/P-Clean/mask-RCNN/PennFudanPed2/labelme_json/.DS_StoreFaster R-CNN数据的格式转换划分数据集设定内…

移掉 K 位数字(LeetCode 402)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力法4.2 贪心 单调栈 参考文献 1.问题描述 给你一个以字符串表示的非负整数 num 和一个整数 k,移除这个数中的 k 位数字,使得剩下的整数最小。请你以字符串形式返回这个最小的整数。 示例 1 …

进电子厂了,感触颇多...

作者:三哥 个人网站:https://j3code.cn 本文已收录到语雀:https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的,真进电子厂了,但主人公不是我。 虽然我不是主人公,但是我经历的过程是和主…

Igraph入门指南 6

3、make_系列:igraph的建图工具 按照定义,正则图是指各顶点的度均相同的无向简单图,因为我目前没有找到描述度相等的有向(或自环图)的标准名称,所以在本文中借用一下这个概念,并加上定语有向无…

Android studio SDK Manager显示不全的问题解决

发现SDK Manager中只显示已下载的SDK版本,想下载其他版本下载不到,尝试翻墙也没用,修改host文件成功 在多个地点Ping服务器,网站测速 - 站长工具 输入dl.google.com,进行ping检测。 选择一个地址,比如180.163.150.1…

【深度学习笔记】5_12稠密连接网络(DenseNet)

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.12 稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

Python学习:基础语法

版本查看 python --version编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 特殊情况下,也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-标识符 第一个字符必须是字母表中字母或…

Java学习笔记------常用API

Math类 常用方法: 1. publicb static int abs(int a) 获取参数绝对值 2. publicb static double ceil(double a) 向上取整 3. publicb static floor(double a) 向下取整 4.public static int round(float a) 四舍五入 5. publicb static int max…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中,可采用 redirect 来重定向到另一个地址: 通常是将 / 重定向到 某个页面; 示例展示: router/index.js:import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

云桥通SDWAN企业组网的15大应用场景

云桥通SD-WAN企业组网技术在企业网络中有多样化的应用场景,在技术不断迭代升级中,已经越来越匹配现在的互联网环境,其中在这15中常见的应用场景中,使用云桥通SDWAN企业组网可以很好的帮到企业: 分支机构连接优化&#…

蓝桥杯之【01背包模版】牛客例题展示

牛客链接 #include <bits/stdc.h> using namespace std; int n,V; const int N1010; int v[N],w[N]; int dp[N][N]; int main() {cin>>n>>V;for(int i1;i<n;i){cin>>v[i]>>w[i];}for(int i1;i<n;i){for(int j1;j<V;j){dp[i][j]dp[i-1][…

力扣刷题Days16(js)-67二进制求和

目录 1,题目 2&#xff0c;代码 2.1转换进制数 2.2模拟加法 3&#xff0c;学习与总结 Math.floor() 模拟加法思路回顾 重点复习巩固 模拟加法的思路和学习位运算&#xff1b; 今天没精力了&#xff0c;先休息 1,题目 给你两个二进制字符串 a 和 b &#xff0c;以二进制…