Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)

1 hive的优缺点

优点

  • SQL
  • 减少MR的开发难度
  • 使用于实时性不高的数据分析场合
  • 优势处理大数据
  • 自定义函数

缺点

  • Hql表达能力优先:迭代式算法?

  • 处理延迟效率较低,小数据的时候,不如传统数据库

2 对hive的了解

优点+本质:基于hadoop将HQL转换成MR的工具

3. hive架构

  • 用户接口
  • 元数据:表,数据库,字段,表类型,表目录
  • hadoop:hdfs和driver
  • 驱动器:解析器、编译器、优化器、执行器

4. 外部表和内部表区别(高频)

  • 外部表被external修饰
  • 存储管理:外部表hdfs,内部表hive
  • 存储位置:外部表存储可以自己定义,并且可以和其他外部表共享数据
  • 创建表:内部表会将数据移动到所指定的路径,外部表仅仅记录了数据所在路径
  • 删除表:外部表删除元数据,存储数据不会被删除,内部表都会一起删掉,外部表安全
  • 修改表:外部表对分区和表结构进行修改,需要修复MSCK REPAIR TABLE table_name;外部表会直接更改元数据

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第1张图片

5. hive建表语句

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第2张图片

  • create
  • external
  • comment
  • partition by分区
  • clustered by分桶表
  • row format delimited
    • fields terminated by
    • lines terminated by如果没指定会使用SerDe(序列化和反序列化)
    • 分隔符如果特殊可以用multidelimitserde
  • stored as
  • location

6. hive数据倾斜/优化[待完善]

  • 含义:key值的数据过多导致的某几个reduce的节点 运行比较慢

  • 关键词:join、空值、group by维度过小,count distinct特殊值较多

  • 聚合倾斜group by解决

    • 参数调节set hive.map.aggr=true代表开启map端预聚合
    • set hive.groupby.skewindata=true;均衡数据倾斜的配置项
    • 具体:两个MR的job,第一个MR的map的输出结果会随机给到reducer,随机表示可以一定程度达到负载均衡的目的。第二个MR会再去根据预处理结果把相同的key值放到同一个reduce中
  • join倾斜解决

    • join的时候选择join key分布最均衡的表作为驱动表
    • 大小表join让小的表加载到内存中在map段进行join,避免reducer处理,提高效率
    • 大表和大表join:null值不参与运算或者给key值中null值后面加上随机值,不会影响结果
    • 多表join:在原理中也有,可以使用同一列为join条件仅仅会 生成一个MRjob
  • count distinct优化

    • 使用使用count…group by代替count(distinct)。如:即group by在子查询中,再count字段

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第3张图片

  • map阶段优化:可以通过调整map和reduce的个数来进行优化,分别是map.tasks和reducer.tasks,

    • map的个数取决于input的文件数和大小,文件无论大小都会当成一个map任务执行,因此可以在map执行前合并小文件,根据实际环境减少map个数。辩证分析也不是全部是减少,如果一个文件127M但是字段很少,数据很多,需要增大map的个数了

    • 因为有多少reduce就会有多少输出的文件,如果作为下一个的输入文件,也会产生产生小文件,一般调整有几个考虑,根据map的输出估算reduce的个数和实际环境

    • map数量的参数
      Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第4张图片

    • reducer数量的参数
      Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第5张图片

  • hive输出小文件参数调整

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第6张图片


  • 行列/分区过滤

    • select的时候只拿所需的列
    • 只读所需要的分区,有两个参数,都是默认true
    • 谓词下推,将where写在子查询中,有参数可以调整,尽量将过滤条件提前执行,使得最后参与join的表的数据量更小
    • 少用join,可以转换成case
  • sort by代替order by

    • sort by是保证多个reduce进行排序,并且保证每个reduce有序,可以再加distribute by排序,不加就随机分配
  • 插入数据的时候少用动态分区,可以采用distributed by rand(),可以使得后续处理reduce的数据大致相同

在这里插入图片描述

  • 压缩优化:
    • 设置中间结果压缩,减少数据倾斜以及减少io流和网络传输
    • 使用sequencefile作为表存储,可以减少小文件,二进制kv存储,可以合并。或者是常用testfile以及parquent
  • jvm重用:调节参数增加一个JVM可以执行多个MR job
  • 压箱方法:把倾斜值值拿出来后打上随机值后处理在union回去

7. hive自定义函数

  • 继承UDF类,或者UDAF和UDTF
  • 写代码后打包成jar包并注册该jar文件
  • 为这个类起别名create temporary function as ‘xx’
  • 使用select进行使用

8. hive中有哪些UDF

  • UDF:一进一出,upper
  • UDAF:聚合函数,多进一出,sum/min
  • UDTF:表函数,一进多出,explore,split

9. cluster by,sort by,distributor by,order by区别

  • order by:全局排序,在只有一个reduder的时候使用,数据量大需要时间多
  • sort by:非全局排序,在数据进入reduce前排序,只能保证每个reduce输出有序
  • distributor by:分区排序,按照分区字段进行排序
  • cluster by:distribute by Word sort by Word ASC只能升序

10. 分区和分桶的区别

  • 定义上:
    • 分区相当于在hdfs的子目录中包含了分区对应的名字,子分区就是子目录
    • 分桶在分区表上是根据hash算法进行组织,每个桶有数据,但是数量不一定一致
  • 关系:cluster by:distribute by Word sort by Word ASC只能升序,分区容易数据倾斜,分桶比较平均
  • 关系:外部表和内部表,分区表都是对HDFS上的目录,桶表对应是目录中的文件

11. hive的查询执行流程

  • 用户提交任务给到driver

  • 编译器获取任务后去metastore获取hive的元数据,编译过程:

    • hivesql转换为抽象语法树
    • 遍历抽象语法树,抽象出查询的基本单元queryblock
    • 遍历查询块,翻译为执行操作树operatortree
  • 优化器:

    • 逻辑优化器进行操作数变换,合并不需要的reducesinkoperator,减少shuffle

    • 遍历operatortree翻译成MR生成最终执行计划

  • 最终将计划给回到driver后转交ExcutorEngine去执行,获取元数据,然后交给hadoop那边的jobtracker执行,会直接读取hdfs上的文件进行操作

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第7张图片

12. hive创建表流程

  1. 获取到hive语句的信息,包括表,字段,分区等,先写到元数据中,主要是通过sequence_table中构建对象的ID,然后同步到系统表?
  2. 执行顺序

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第8张图片

13. hivesql的实现原理

  • join

    • 基本原理
      Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第9张图片

    • 多表join:如果多表使用同一列进行关联将会被翻译成一个reduce,否则将会被翻译成多个reduce任务,原因是因为多表基于不同的列做join,无法在一轮MR任务中将数据shuffle到reducer中,多表的时候会将中间表缓存在reducer的内存中,然后后面的表会流式的进入进行接下来的任务

    • join的分类:分为map join和common join,如果参数设置的是hive.auto.convert.join = true,那么小表和大表join就会转化成mapjoin,reducer不做join处理。common join就是一般认为的common join了

  • group by

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第10张图片

  • distinct

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第11张图片

  • distinct+count

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)_第12张图片

14. hive的计算引擎?

  • MR引擎
  • Tez
    • 特点是将原有的map和reduce简化为一个概念:vertex,计算节点被拆分成vertex input,vertex output,sorting,merging,这些元素可以任意组装形成一个大的DAG作业,由map和reduce变成map-reduce-reduce,似流水线,减少了调度
    • yarn依然作为资源调度和管理,但是不是提交到resourcemanager而是AMPoolServer,存放着已经预先启动的Applicationmaster
    • tez针对mapreduce的序列化和反序列化是可以在内存中处理的
  • spark:通过支持DAG作业的计算引擎

15. hive的存储引擎

  • testfile:按行存储,不支持块压缩,磁盘开销大,加载速度最高

  • rcfile:

    • 按行存储,每块按照列压缩,结合了行存储和列存储的特点,
  • ORCFile:

    • 是refile的升级版,加了索引
  • parquet:列式存储,压缩比ORC低一些,查询效率较低,

  • sequencefile:hadoop api中的二进制文件,以kv形式序列化到文件中

  • 压缩比:orc>parquet>testfile 查询速度:三者差不多

16. hive的count的用法

  • count(*):所有行进行统计,包括null
  • count(1):所有行进行统计,包括null
  • count(字段):不包含null

17 hive存储数据的方式/保存元数据的方式

  1. hive的元数据存储
  • 内嵌模式:保存本地的derby数据库
  • 本地模式:保存本地mysql中
  • 远程模式:需要单独起元数据
  1. hive的表数据存储
  • 存在hdfs中,这些数据的元数据存在namenode中

18 hiveserver2是什么

  1. 是一个服务器端口,远程客户端可以执行对hive的增删改查
  2. 基于thrift RPC,支持多客户端并发和身份验证

19 hive表字段换类型如何修改?

  1. 使用alter table change column针对没有数据的时候
  2. 有数据使用
  • 先将要该字段结构的表名修改成一个临时表:alter table 表1 rename to 表2
  • 创建和表1 一模一样的表3
  • 将表2的结果插入到新表

20 案例:连续活跃登陆的用户指至少连续2天都活跃登录的用户

Hive-SQL查询连续活跃登录用户 - 渐逝的星光 - 博客园 (cnblogs.com)

21案例: hive怎么实现行转列或者列转行

22 hive的常用函数

(130条消息) Hive函数大全_斑马!的博客-CSDN博客_hive函数

23 hive常用的sql语句

你可能感兴趣的:(hive,面试,大数据)