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。
一般用于快速出结果,数据量比较小的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化运维工具Ansible

一.Ansible基本内容 1.定义 Ansible是基于模块工作的,只是提供了一种运行框架,本身没有完成任务的能力,真正操作的是Anisble的模块。每个模块都是独立的、实现了批量系统配置、批量程序部署、批量运行命令等功能。 2.特点与优势 优势&…

【Python爬虫神器揭秘】手把手教你安装配置Scrapy,高效抓取网络数据

1、 引言 在大数据时代,网络上的信息犹如海洋般浩瀚。想要在这片海洋里挖掘宝藏,一款强大的工具必不可少。今天我们要带大家深入探索的就是Python界鼎鼎大名的爬虫框架——Scrapy。无论你是数据分析师、研究员还是开发者,学会利用Scrapy来自…

基于单片机的IC 卡门禁系统设计

摘要:针对传统门锁钥匙易丢失、配置不便和忘记携带等问题,提出了一种基于STC89C52 的IC 卡门禁系统设计。该系统以STC89C52 单片机为核心来控制电子锁模块的开关。主要过程是由RFID 模块读取IC卡ID 并通过串口发送至STC89C52 单片机模块,STC89C52 单片机模块可以实现在线对I…

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件,这种问题到底要怎么去解决呢?其实这种现象是正常的,为啥说正常呢,下面我们会给大家详细的讲解dll为啥会缺少,然后还会讲解电脑缺少dll文件怎么解决的方法,好了&#xff…

ARM学习(25)链接装载高阶认识

ARM学习(25)链接装载高阶认识 1、例子引出 笔者先引入几个编译链接的例子来介绍一下: 声明无效:declared implicitly?,属于编译错误还是链接错误? 编译阶段的错误,属于编译错误&am…

【DDR】DDR4学习记录

这里以美光DDR4芯片 MT40A512M16HA-075E datasheet 为例,说明DDR4存储器的原理及仿真。   根据开发板手册ug1302,在vcu128(xcvu37p)开发板上,共具有5块DDR4芯片,在数据信号上4块DDR4具有16位数据线&#…

七月论文审稿GPT第3.1版和第3.2版:通过paper-review数据集分别微调Mistral、gemma

前言 我司第二项目组一直在迭代论文审稿GPT(对应的第二项目组成员除我之外,包括:阿荀、阿李、鸿飞、文弱等人),比如 七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV七月论文审稿GPT第2版:用一万…

Scrapy 爬虫框架

网络爬虫框架scrapy (配置型爬虫) 什么是爬虫框架? 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是个半成品,帮助用户实现专业网络爬虫 scrapy框架结构("52"结构) spider: 解析downloader返回的响…

第四弹:Flutter图形渲染性能

目标: 1)Flutter图形渲染性能能够媲美原生? 2)Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia 1)Flutter将一帧录制成SkPicture(skp&#xff…

Doris部署学习(一)

目录 前言 一、Docker容器支持 二、Doris编译步骤 1.拉取镜像 2.构建Docker编译容器 3.下载源码并编译 前言 本文档主要介绍如何通过源码在Docker编译 Doris,以及部署。 一、Docker容器支持 Docker教程:Docker & Docker-Compose 安装教程 - 知…

jupyter 修改文件保存位置 步骤

一、找到配置文件位置 打开Anaconda Prompt,输入: jupyter notebook --generate-config 根据得到的路径,以记事本方式打开配置文件 二、修改路径 在文件中输入: c.NotebookApp.notebook_dir E:\\deepLearning\\Jupyter_files…

Vue的渲染原理

列表渲染 列表渲染 v-for指令写在循环项上:v-for“(一个参数或者两个参数) in/of 要遍历的数组、对象、字符串、指定次数” 遍历数组时参数分别是数组中元素(可以是一个对象)和元素所在下标(从0开始)遍历对象时参数分别是属性值和属性名遍历字符串时参数分别是单…

人工智能在增强数据安全方面的作用

近年来,人工智能(AI)的力量已被证明是无与伦比的。它不再是我们想象的主题。人工智能已经成为现实,并且越来越清楚地表明它可以让世界变得更美好。但人工智能能帮助我们增强数据安全吗? 由于技术的日益普及&#xff0…

概率与常见的概率分布

概率是数据分析、机器学习中最基础的知识。也是在生活中最实用的一门学科,学了很多大道理不一定能过好一生,学好概率则有一定概率会变得更好。为大概率坚持,为小概率备份。 概率与分布 要想了解概率,首先得搞清楚概率和概率分布的…

力扣L9--- 12. 整数转罗马数字--2024年3月12日

1.题目 2.知识点 &#xff08;1&#xff09;HaspMap的一些基本语法 1&#xff09;创建 HashMap&#xff0c;用于存储键为 String 类型、值为 Integer 类型的键值对。 HashMap<String, Integer> map new HashMap<>();2&#xff09;添加键值对&#xff1a; map.p…

DAY14二叉树迭代遍历

二叉树前序迭代法遍历 前序遍历是中左右&#xff0c;每次先处理的是中间节点&#xff0c;那么先将根节点放入栈中&#xff0c;然后将右孩子加入栈&#xff0c;再加入左孩子。 为什么要先加入 右孩子&#xff0c;再加入左孩子呢&#xff1f; 因为这样出栈的时候才是中左右的顺…

刷题日记——01字符串、非素数个数(厦门大学机试)

题目1——01字符串 分析 经过拆解找规律&#xff0c;发现是两个斐波那契 那么代码就好写了呀 #include <stdio.h>unsigned long long f(int n){if(n0||n1){return n;}return (f(n-1)f(n-2))%2333333; }int main(){int n;scanf("%d",&n);printf("%…

2.Datax数据同步之Windows下,mysql和sqlserver之间的自定义sql文数据同步

目录 前言步骤操作大纲步骤明细mysql 至 sqlServersqlServer 至 mysql执行同步语句中报 前言 上一篇文章实现了不同的mysql数据库之间的数据同步&#xff0c;在此基础上本篇将实现mysql和sqlserver之间的自定义sql文数据同步 准备工作&#xff1a; JDK(1.8以上&#xff0c;推…

亲测抖音小程序备案流程,抖音小程序如何备案,抖音小程序备案所需准备资料

抖音小程序为什么要备案&#xff0c;抖音官方给出如下说明&#xff1a; 1、2024年3月15日后提交备案的小程序将不保证2024年3月31日前平台可初审通过&#xff1b; 2、2024年3月31日后未完成备案小程序将被下架处理。 一&#xff0c;备案前需准备资料 &#xff08;一&#xff0…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…