Hive面试题

Hive面试题

  • Hive高频面试题
  • 1.简述Hive的主要架构
  • 2.Hive和传统数据库有和区别?
    • 2.1.数据存储位置
    • 2.2.数据更新
    • 2.3.执行延迟
    • 2.4.数据规模
  • 3.Hive的内部表和外部表分别是什么?有什么区别?
    • 3.1.删除数据时:
    • 3.2.在公司生产环境下,什么时候创建内部表,什么时候创建外部表?
  • 4.Hive中order by、sort by、distribute by、cluster by有什么区别?
  • 5.Hive中常用的系统函数都有哪些?
  • 6.如何在Hive中自定义UDF、UDTF函数?
    • 6.1.在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?
    • 6.2.为什么要自定义UDF/UDTF?
  • 7.Hive中的窗口函数都有哪些?如何使用?
    • 7.1.Rank
    • 7.2.OVER():
  • 8.Hive都要哪些优化手段?
    • 8.1.MapJoin
    • 8.2.行列过滤
    • 8.3.列式存储
    • 8.4.采用分区技术
    • 8.5.合理设置Map数
    • 8.6.合理设置Reduce数
    • 8.7.小文件如何产生的?
    • 8.8.小文件解决方案
    • 8.9.开启map端combiner(不影响最终业务逻辑)
    • 8.10.压缩(选择快的)
    • 8.11.采用tez引擎或者spark引擎
  • 9.Hive中如何解决数据倾斜的?
    • 9.1.数据倾斜长啥样?
    • 9.2.怎么产生的数据倾斜?
    • 9.3.解决数据倾斜的方法?
  • 10.Hive里边字段的分隔符用的什么?为什么用\t?有遇到过字段里边有\t的情况吗,怎么处理的?
  • 11.TEZ引擎都有哪些优点?
  • 12.如何对MySQL的元数据进行备份?
  • 13.union和union all有什么区别?

Hive高频面试题

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

1.简述Hive的主要架构

Hive元数据默认存储在derby数据库,不支持多客户端访问,所以需要将元数据存储在MySQl,以支持多客户端访问。主要架构如下:
Hive面试题_第1张图片

2.Hive和传统数据库有和区别?

Hive和数据库除了拥有类似的查询语言,再无类似之处。主要区别在以下几个方面

2.1.数据存储位置

Hive将数据存储在HDFS 。数据库将数据保存在块设备或者本地文件系统中。

2.2.数据更新

Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,

2.3.执行延迟

Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

2.4.数据规模

Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。

3.Hive的内部表和外部表分别是什么?有什么区别?

主要区别在两方面:元数据和原始数据。

3.1.删除数据时:

内部表:元数据、原始数据,全删除;
外部表:只删除元数据;

3.2.在公司生产环境下,什么时候创建内部表,什么时候创建外部表?

在公司中绝大多数场景都是外部表;
自己使用的临时表,才会创建内部表。

4.Hive中order by、sort by、distribute by、cluster by有什么区别?

(1)Order By:全局排序,只有一个Reducer;
(2)Sort By:分区内有序;
(3)Distrbute By:类似MR中Partition,进行分区,结合sort by使用。
(4)Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
在生产环境中Order By用的比较少,容易导致OOM。
在生产环境中Sort By + Distrbute By用的多。

5.Hive中常用的系统函数都有哪些?

(1)date_add、date_sub函数(加减日期)
(2)next_day函数(周指标相关)
(3)date_format函数(根据格式整理日期)
(4)last_day函数(求当月最后一天日期)
(5)collect_set函数
(6)get_json_object解析json函数
(7)NVL(表达式1,表达式2)
如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。

6.如何在Hive中自定义UDF、UDTF函数?

6.1.在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?

(1)用UDF函数解析公共字段;用UDTF函数解析事件字段。
(2)自定义UDF:继承UDF,重写evaluate方法
(3)自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

6.2.为什么要自定义UDF/UDTF?

因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试。

7.Hive中的窗口函数都有哪些?如何使用?

7.1.Rank

(1)RANK() 排序相同时会重复,总数不会变
(2)DENSE_RANK() 排序相同时会重复,总数会减少
(3)ROW_NUMBER() 会根据顺序计算

7.2.OVER():

指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化
(1)CURRENT ROW:当前行
(2)n PRECEDING:往前n行数据
(3)n FOLLOWING:往后n行数据
(4)UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
(5)LAG(col,n):往前第n行数据
(6)LEAD(col,n):往后第n行数据
(7)NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

8.Hive都要哪些优化手段?

8.1.MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

8.2.行列过滤

列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

8.3.列式存储

8.4.采用分区技术

8.5.合理设置Map数

mapred.min.split.size: 指的是数据的最小分割单元大小;min的默认值是1B
mapred.max.split.size: 指的是数据的最大分割单元大小;max的默认值是256MB
通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数。
需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。
https://www.cnblogs.com/swordfall/p/11037539.html

8.6.合理设置Reduce数

Reduce个数并不是越多越好
(1)过多的启动和初始化Reduce也会消耗时间和资源;
(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;

8.7.小文件如何产生的?

(1)动态分区插入数据,产生大量的小文件,从而导致map数量剧增;
(2)reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
(3)数据源本身就包含大量的小文件。

8.8.小文件解决方案

(1)在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
(2)merge
// 输出合并小文件SET hive.merge.mapfiles = true; 默认true,在map-only任务结束时合并小文件
SET hive.merge.mapredfiles = true; 默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; 默认256M
SET hive.merge.smallfiles.avgsize = 16777216; 当输出文件的平均大小小于16m该值时,启动一个独立的map-reduce任务进行文件merge

(3)开启JVM重用
set mapreduce.job.jvm.numtasks=10

8.9.开启map端combiner(不影响最终业务逻辑)

set hive.map.aggr=true;

8.10.压缩(选择快的)

设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)
set hive.exec.compress.intermediate=true --启用中间数据压缩set mapreduce.map.output.compress=true --启用最终数据压缩setmapreduce.map.outout.compress.codec=…; --设置压缩方式

8.11.采用tez引擎或者spark引擎

9.Hive中如何解决数据倾斜的?

9.1.数据倾斜长啥样?

Hive面试题_第2张图片
Hive面试题_第3张图片

9.2.怎么产生的数据倾斜?

(1)不同数据类型关联产生数据倾斜
情形:比如用户表中user_id字段为int,log表中user_id字段string类型。当按照user_id进行两个表的Join操作时。
解决方式:把数字类型转换成字符串类型
select * from users a
left outer join logs b
on a.usr_id = cast(b.user_id asstring)
bug记录:https://www.jianshu.com/p/2181e00d74dc
(2)控制空值分布
在生产环境经常会用大量空值数据进入到一个reduce中去,导致数据倾斜。
解决办法:
自定义分区,将为空的key转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分不到多个Reducer。
注意:对于异常值如果不需要的话,最好是提前在where条件里过滤掉,这样可以使计算量大大减少。

9.3.解决数据倾斜的方法?

(1)group by
注:group by 优于distinct group
解决方式:采用sum() group by的方式来替换count(distinct)完成计算。
(2)mapjoin
(3)开启数据倾斜时负载均衡
sethive.groupby.skewindata=true;
思想:就是先随机分发并处理,再按照key group by来分发处理。
操作:当选项设定为true,生成的查询计划会有两个MRJob。
第一个MRJob中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的原始GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
点评:它使计算变成了两个mapreduce,先在第一个中在shuffle过程partition时随机给 key打标记,使每个key随机均匀分布到各个reduce上计算,但是这样只能完成部分计算,因为相同key没有分配到相同reduce上。
所以需要第二次的mapreduce,这次就回归正常shuffle,但是数据分布不均匀的问题在第一次mapreduce已经有了很大的改善,因此基本解决数据倾斜。因为大量计算已经在第一次mr中随机分布到各个节点完成。
(4)设置多个reduce个数。

10.Hive里边字段的分隔符用的什么?为什么用\t?有遇到过字段里边有\t的情况吗,怎么处理的?

hive 默认的字段分隔符为ascii码的控制符\001(^A),建表的时候用fields terminated by’\001’。注意:如果采用\t或者\001等为分隔符,需要要求前端埋点和javaEE后台传递过来的数据必须不能出现该分隔符,通过代码规范约束。一旦传输过来的数据含有分隔符,需要在前一级数据中转义或者替换(ETL)。
可以设置参数(导入HDFS同样有效):
–hive-drop-import-delims 导入到hive时删除 \n, \r, \001
–hive-delims-replacement 导入到hive时用自定义的字符替换掉 \n, \r, \001

字段包含分隔符存在的问题:
Hive面试题_第4张图片

添加参数的效果:
Hive面试题_第5张图片

在Hive表里的体现:
Hive面试题_第6张图片

11.TEZ引擎都有哪些优点?

Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。
Mr/tez/spark区别:
Mr引擎:多job串联,基于磁盘,落盘的地方比较多。虽然慢,但一定能跑出结果。一般处理,周、月、年指标。
Spark引擎:虽然在Shuffle过程中也落盘,但是并不是所有算子都需要Shuffle,尤其是多算子过程,中间过程不落盘 DAG有向无环图。兼顾了可靠性和效率。一般处理天指标。
Tez引擎:完全基于内存。 注意:如果数据量特别大,慎重使用。容易OOM。一般用于快速出结果,数据量比较小的场景。

12.如何对MySQL的元数据进行备份?

(1)MySQL之元数据备份(项目中遇到的问题)
元数据备份(重点,如数据损坏,可能整个集群无法运行,至少要保证每日零点之后备份到其它服务器两个复本)。
搭建MySQL元数据服务的高可用集群。
(2)MySQL utf8 超过字节数问题
MySQL的utf8编码最多存储3个字节,当数据中存在表情号、特色符号时会占用超过3个字节数的字节,那么会出现错误 Incorrect string value: ‘\xF0\x9F\x91\x91\xE5\xB0…’
解决办法:将utf8修改为utf8mb4。
首先修改库的基字符集和数据库排序规则:
Hive面试题_第7张图片

再使用 SHOW VARIABLES LIKE ‘%char%’; 命令查看参数:
Hive面试题_第8张图片
确保这几个参数的value值为utf8mb4 如果不是,则使用set命令修改。
如:set character_set_server = utf8mb4;

13.union和union all有什么区别?

(1)union会将联合的结果集去重,效率较union all差;
(2)union all不会对结果集去重,所以效率高。

参考:https://mp.weixin.qq.com/s/l0n1VA0ZCfzyhpikdPN2mg

你可能感兴趣的:(Hive,MapReduce,面试题,hive,mapreduce)