Hive面试

29.Hive有哪些保存元数据的方式,都有什么特点?
hive有哪些保存元数据的方式,各有什么特点。
1.内存数据库derby,安装小,但是数据存在内存,不稳定
2.mysql数据库,数据存储模式可以自己设置,持久化好,查看方便

Hive元数据存储的三种模式
1)、内嵌模式:将元数据保存在本地内嵌的derby数据库中,内嵌的derby数据库每次只能访问一个数据文件,也就意味着它不支持多会话连接。
2). 本地模式:将元数据保存在本地独立的数据库中(一般是mysql),这可以支持多会话连接。
3). 远程模式:把元数据保存在远程独立的mysql数据库中,避免每个客户端都去安装mysql数据库
三种配置方式区别
1.内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。
2.本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。
3.本地元存储和远程元存储的区别是:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程
Metadata、Metastore作用
metadata即元数据。元数据包含用Hive创建的database、tabel等的元信息。
元数据存储在关系型数据库中。如Derby、MySQL等。
**Metastore的作用是:**客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

HIve内部表和外部表的区别,以及外部表为什么不删除数据
创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。

删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

1.未被external修饰的是内部表【managed table】,被external修饰的为外部表【external table】。

2.内部表数据由Hive自身管理,外部表数据由HDFS管理。

4.删除内部表会直接删除元数据【metadata】及存储数据,删除外部表仅仅删除元数据,HDFS上的文件不会被删除。

5.对内部表的修改会直接同步到元数据,而对外部表的表结构和分区进行修改,则需要修改【MSCK REPAIR TABLE table_name】

1.Hive row_number,rank两个函数的区别
2.Hive窗口函数怎么设置窗口大小

————————
select city,year,taxes,
sum(money) over() as sample1,–所有行相加
sum(money) over(partition by city) as sample2,–按city分组,组内数据相加
sum(money) over(partition by city order by year) as sample3,–按city分组,组内数据累加
sum(money) over(partition by city order by year rows between UNBOUNDED PRECEDING and current row ) as sample4 ,–和sample3一样,由起点到当前行的聚合
sum(money) over(partition by city order by year rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合
sum(money) over(partition by city order by year rows between 1 PRECEDING and 1 FOLLOWING ) as sample6,–当前行和前边一行及后面一行
sum(money) over(partition by city order by year rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行
from business;
————————
3.Hive order by,sort by,distribute by,cluster by 区别
4.Hive map,reduce数怎么设置

————————————————
一、概述
1.通常情况下,作业会通过 input 的目录产生一个或者多个 map 任务。主要的决定因素有:input 的文件总个数,input 的文件大小,集群设置的文件块大小。
2.是不是 map 数越多越好?答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个 map 任务来完成,而一个 map 任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的 map 数是受限的。
3.是不是保证每个 map 处理接近 128m 的文件块,就高枕无忧了?答案也是不一定。比如有一个 127m 的文件,正常会用一个 map 去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果 map 处理的逻辑比较复杂,用一个 map任务去做,肯定也比较耗时。
针对上面的问题 2 和 3,我们需要采取两种方式来解决:即减少 map 数和增加 map 数;

二、实操
1.复杂文件增加 Map 数(对应概述的问题3)
当 input 的文件都很大,任务逻辑复杂,map 执行非常慢的时候,可以考虑增加 Map 数,来使得每个 map 处理的数据量减少,从而提高任务的执行效率。
增加 map 的方法为:根据公式:
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
调整 maxSize 最大值,让 maxSize 最大值低于 blocksize 就可以增加 map 的个数。
案例实操:
1)执行查询

hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 1; number of
reducers: 1
2)设置最大切片值为 100 个字节

hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100;
hive (default)> select count(*) from emp;
Hadoop job information for Stage-1: number of mappers: 6; number of
reducers: 1
2.小文件进行合并(对应概述的问题2)
对于概述中的问题2,我们对小文件进行合并分两种情景:

读取数据时合并小文件
生成数据时合并小文件
1)在 map 执行前合并小文件,以此来减少 map数:CombineHiveInputFormat 具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
2)在 Map-Reduce 的任务结束时合并小文件的设置:

在 map-only 任务结束时合并小文件,默认 true
SET hive.merge.mapfiles = true;
在 map-reduce 任务结束时合并小文件,默认 false
SET hive.merge.mapredfiles = true;
合并文件的大小,默认 256M

SET hive.merge.size.per.task = 268435456;
当输出文件的平均大小小于该值时,启动一个独立的 map-reduce 任务进行文件 merge
SET hive.merge.smallfiles.avgsize = 16777216;

3.合理设置 Reduce 数
1)调整 reduce 个数方法一
(1)每个 Reduce 处理的数据量默认是 256MB
hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的 reduce 数,默认为 1009
hive.exec.reducers.max=1009
(3)计算 reducer 数的公式
N=min(参数 2,总输入数据量/参数 1)
2)调整 reduce 个数方法二
在 hadoop 的 mapred-default.xml 文件中修改
设置每个 job 的 Reduce 个数
set mapreduce.job.reduces = 15;
3)reduce 个数并不是越多越好
过多的启动和初始化 reduce 也会消耗时间和资源;
另外,有多少个 reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
在设置 reduce 个数的时候也需要考虑这两个原则:

处理大数据量利用合适的 reduce 数;
使单个 reduce 任务处理数据量大小要合适;
————————————————
5.Hive SQL数据倾斜有哪些原因?怎么优化

————————————————
二、hive 执行过程中数据倾斜问题
1.描述:
数据倾斜主要表现在,MR程序执行过程中,reduce节点大部分执行完毕,但是有一个或者少数几个节点运行很慢,导致整个程序的处理时间很长。这是因为该reduce处理节点对应的key对应数据条数远超于其他key导致该节点处理数据量太大而不能和其他节点同步完成执行。简而言之,解释同一key对应数据条数太多导致。常见有空值key。

2.原因:
2.1、key分布不均匀。
2.2、业务数据本身的原因。
2.3、建表考虑不周。
2.4、某些SQL本身就有数据倾斜。

3.解决方式:
3.1、给key一个随机值,打乱key,进行第一步操作,然后第二步去掉随机值再处理。
3.2、参数调节:
hive.map.aggr = true Map 端部分聚合,相当于Combiner。
hive.groupby.skewindata=true(万能) 。有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两 个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输 出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分 布到同一个 Reduce 中),最后完成最终的聚合操作。
3.3、SQL语句调节:  
3.3.1 大小表Join:使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.
3.3.2 大表Join大表:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
3.3.3 count distinct大量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
3.3.4 group by维度过小:采用sum() group by的方式来替换count(distinct)完成计算。
3.3.5 特殊情况特殊处理:在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后union回去。
3.4、map和reduce优化。
   3.4.1 当出现小文件过多,需要合并小文件。可以通过set hive.merge.mapfiles=true来解决。
3.4.2 单个文件大小稍稍大于配置的block块的大写,此时需要适当增加map的个数。解决方法:set mapred.map.tasks个数
3.4.3 文件大小适中,但map端计算量非常大,如select id,count(*),sum(case when…),sum(case when…)…需要增加map个数。解决方法:set mapred.map.tasks个数,set mapred.reduce.tasks个数

4.Hive的优化:
4.1、配置fetch抓取:修改配置文件hive.fetch.task.conversion为more,修改之后全局查找和字段查找以及limit都不会触发MR任务。
4.2、善用本地模式:大多数的Hadoop Job要求Hadoop提供完整的可扩展性来触发大数据集,不过有时候hive的输入数据量非常的小,这样的情况下可能触发任务的事件比执行的事件还长,我们就可以通过本地模式把小量的数据放到本地上面计算。
4.3、Group by:默认情况下,map阶段同一key的数据会发给一个reduce,当一个key数据过大就会倾斜,并不是所有的聚合操作都需要reduce端完成,很多聚合操作都可以现在map端进行部分聚合,最后在reduce端得出最终结果。
4.3.1 开启在map端聚合:hive.map.aggr = true。
4.3.2 在map端进行聚合操作的条目数:hive.groupby.mapaggr.checkinterval = 100000。
4.3.3 有数据倾斜的时候进行负载均衡:hive.groupby.skewindata = true。
4.4、行列过滤:列处理:只拿自己需要的列,如果有,尽量使用分区过滤。行处理:在分区裁剪的时候,当使用外关联的时候,先完全关联再过滤。
4.5、动态分区调整:(慎用)
4.5.1 开启动态分区:hive.exec.dynamic.partition=true。
4.5.2 设置为非严格模式:hive.exec.dynamic.partiton.mode = nostrict。
4.5.3 实操:创建分区表、加载数据到分区表中、创建目标分区、设置动态分区、查看目标分区表的分区情况。
4.6、小文件进行合并:在map执行之前合并小文件,减少map的数量,设置 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。
4.7、调整map的数量和reduce的数量。
4.8、并行执行:在Hive中可能有很多个阶段,不一定是一个阶段,这些阶段并非相互依赖的。然后这些阶段可以并行完成,设置并行:set hive.exec.parallel = true。
4.9、JVM的重用,缺点是task槽会被占用,一直要等到任务完成才会释放。
————————————————

**6.parquet数据格式内部结构了解吗

parquet是一个列式存储格式,对于大型查询、指定列查询都是高效的,内部由一个header,四个block,一个footer组成。

header中只包含一个4个字节的数字PAR1用来识别整个Parquet文件格式

文件中所有的metadata都存在于footer中

footer中的metadata包含了格式的版本信息,schema信息、key-value paris以及所有block中的metadata信息

footer中最后两个字段为一个以4个字节长度的footer的metadata,以及同header中包含的一样的PAR1

每一个block都具有一组Row group,她们是由一组Column chunk组成的列数据

每一个column chunk中又包含了它具有的pages

每个page就包含了来自于相同列的值.Parquet同时使用更紧凑形式的编码,当写入Parquet文件时,它会自动基于column的类型适配一个合适的编码
在这里插入图片描述

7.Hive数据选择的什么压缩格式**
————————————————
https://blog.csdn.net/hzp666/article/details/121146341

不同的场景选择不同的压缩方式,肯定没有一个一劳永逸的方法,如果选择高压缩比,那么对于cpu的性能要求要高,同时压缩、解压时间耗费也多;选择压缩比低的,对于磁盘io、网络io的时间要多,空间占据要多;对于支持分割的,可以实现并行处理。

生产中,Map阶段数据落盘通常使用snappy压缩格式(快速压缩解压),reduce阶段数据落盘通常使用gzip或bzip2进行压缩(减少磁盘使用)。

若该压缩格式不支持文件分割,则后续无法实现并行处理,生产优化核心是让每个文件大小略微低于块大小,如块128M怎文文件为125M。未压缩的文件是支持文件分割的

1、5种存储格式
Apache Hive支持Apache Hadoop中使用的几种熟悉的文件格式,如TextFile,RCFile,SequenceFile,AVRO,ORC和Parquet格式。

Cloudera Impala也支持这些文件格式。

在建表时使用STORED AS (TextFile|RCFile|SequenceFile|AVRO|ORC|Parquet)来指定存储格式。

TextFile每一行都是一条记录,每行都以换行符(\ n)结尾。数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。

RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

AVRO是开源项目,为Hadoop提供数据序列化和数据交换服务。您可以在Hadoop生态系统和以任何编程语言编写的程序之间交换数据。Avro是基于大数据Hadoop的应用程序中流行的文件格式之一。

ORC文件代表了优化排柱状的文件格式。ORC文件格式提供了一种将数据存储在Hive表中的高效方法。这个文件系统实际上是为了克服其他Hive文件格式的限制而设计的。Hive从大型表读取,写入和处理数据时,使用ORC文件可以提高性能。

Parquet是一个面向列的二进制文件格式。Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列的查询,Parquet特别有用。Parquet桌子使用压缩Snappy,gzip;目前Snappy默认。
————————————————
8.Hive SQL 如何转化成MR任务的
9.Hive 分桶了解吗

————————————————
一、Hive分区。
是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,

比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。

常用的分区字段都是按照时间来区分。

#创建分区表
create table t1 (
id int comment ‘编号’,
name string comment ‘姓名’,
age int comment’ 年龄’
)
partitioned by (pdate string)
row format delimited fields terminated by ‘\001’
;

常用命令:
查看分区数据:
select * from t1 where pdate=‘2020-01-01’;

查看有哪些分区:
show partitions t1;

向分区插入数据:
insert overwrite table t1 partition(pdate=‘2020-01-01’)
select * from xxx
使用场景:
庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。

数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。最好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。

Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。

为啥还要分桶?分区表是将大的表文件划分成多个小文件以利于查询,但是如果数据分布不均衡,也会影响查询效率。分桶能保证数据分布均衡

二、hive分桶

分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

分桶表的好处:
获得更高的查询处理效率:桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

使取样(sampling)更高效:在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

#常用指令:
#创建分桶表
create table t2(
id int,
name string
)
clustered by (id) sorted by(id) into 4 buckets
;
使用场景:
1.桶表专门用于抽样查询,不是用来存储数据的表,在需要抽样查询时,在创建和使用桶表。
在使用桶表之间,必须要开启桶。

三、hive分区又分桶

可以对数据表分区之后继续分桶。

create table t1 (
id int comment ‘编号’,
name string comment ‘姓名’,
age int comment’ 年龄’
)
partitioned by (pdate string)
clustered by(id) sorted by(id) into 4 buckets
row format delimited fields terminated by ‘\001’
;
————————————————
10.Hive的udf、udaf和udtf了解过吗?自己有没有写过udf

1、UDF:用户定义(普通)函数,只对单行数值产生作用;
继承UDF类,添加方法 evaluate()
2、UDAF:User- Defined Aggregation Funcation;用户定义聚合函数,可对多行数据产生作用;等同与SQL中常用的SUM(),AVG(),也是聚合函数;
3、UDTF:User-Defined Table-Generating Functions,用户定义表生成函数,用来解决输入一行输出多行;
继承GenericUDTF类,重写initialize(返回输出行信息:列个数,类型), process, close三方法
在这里插入图片描述

11.怎么验证Hive SQL 的正确性
————————————————

explain 查看执行计划

大数据的表一般都是有分区的,每个分区对应一个文件,查单个分区数据量就少多了。
比如以每天日期为分区,有三个月的数据,数据很多,加上分区条件查询一天的数据很快,结果没问题,再把分区条件去掉查询所有数据。
————————————————
12.lateral view explode关键字来拆分数组
13.join操作底层的MapReduce是怎么去执行的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Hive面试题(约3.3w字)
1.说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么?
2.说下Hive是什么?跟数据仓库区别?
3.Hive架构
4.Hive内部表和外部表的区别?
5.为什么内部表的删除,就会将数据全部删除,而外部表只删除表结构?为什么用外部表更好?
6.Hive建表语句?创建表时使用什么分隔符?
7.Hive删除语句外部表删除的是什么?
8.Hive数据倾斜以及解决方案
9.Hive如果不用参数调优,在map和reduce端应该做什么
10.Hive的用户自定义函数实现步骤与流程
11.Hive的三种自定义函数是什么?实现步骤与流程?它们之间的区别?作用是什么?
12.Hive的cluster by、sort bydistribute by、orderby区别?
13.Hive分区和分桶的区别
14.Hive的执行流程
15.Hive SQL转化为MR的过程?
16.Hive SQL优化处理
17.Hive的存储引擎和计算引擎
18.Hive的文件存储格式都有哪些
19.Hive中如何调整Mapper和Reducer的数目
20.介绍下知道的Hive窗口函数,举一些例子
21.Hive的count的用法
22.Hive的union和unionall的区别
23.Hive的join操作原理,leftjoin、right join、inner join、outer join的异同?
24.Hive如何优化join操作
25.Hive的mapjoin
26.Hive语句的运行机制,例如包含where、having、group by、orderby,整个的执行过程?
27.Hive使用的时候会将数据同步到HDFS,小文件问题怎么解决的?
28.Hive Shuffle的具体过程
29.Hive有哪些保存元数据的方式,都有什么特点?
30.Hive SOL实现查询用户连续登陆,讲讲思路
31.Hive的开窗函数有哪些
32.Hive存储数据吗
33.Hive的SOL转换为MapReduce的过程?
34.Hive的函数:UDF、UDAF、UDTF的区别?
35.UDF是怎么在Hive里执行的
36.Hive优化
37.row_number,rank,dense_rank的区别
38.Hive count(distinct)有几个reduce,海量数据会有什么问题
39.HQL:行转列、列转行
40.一条HQL从代码到执行的过程
41.了解Hive SQL吗?讲讲分析函数?
42.分析函数中加Order By和不加Order By的区别?
43.Hive优化方法
44.Hive里metastore是干嘛的
45.HiveServer2是什么?
46.Hive表字段换类型怎么办
47.parquet文件优势

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值