Hive面试知识点

1.Hive中的排序关键字有哪些?

    order by
    全局排序,只有一个reducetask,数据量比较大的话排序会比较慢。

    sort by
    只对每个reduce内部的数据进行排序

    distribute by
    于分桶的功能,或者说MR当中的分区,主要是按照指定的字段,将数据划分到不同的            reduce里面去。

    Cluster by
    相当于sort by+distribute by.

    如果order by排序的字段和distribute by 排序的字段都是id,那么,可以写成

    order by id+distribute by id ===cluster by id

    也是在每个reduce内部进行排序。

    默认只能为升序排序,不能降序排序。

2.分析下hive数据倾斜问题?

    大家想想,在map和reduce两个阶段中,最容易出现数据倾斜的就是reduce阶段,因为map到reduce会经过shuffle阶段,在shuffle中默认会按照key进行hash,如果相同的key过多,那么hash的结果就是大量相同的key进入到同一个reduce中,导致数据倾斜。

    那么有没有可能在map阶段就发生数据倾斜呢,是有这种可能的。

    一个任务中,数据文件在进入map阶段之前会进行切分,默认是128M一个数据块,但是如果当对文件使用GZIP压缩等不支持文件分割操作的压缩方式时,MR任务读取压缩后的文件时,是对它切分不了的,该压缩文件只会被一个任务所读取,如果有一个超大的不可切分的压缩文件被一个map读取时,就会发生map阶段的数据倾斜。

    所以,从本质上来说,发生数据倾斜的原因有两种:一是任务中需要处理大量相同的key的数据。二是任务读取不可分割的大文件。

3.Count(Distinct) 去重统计

数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换

尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积

4.如何将文件导⼊到hive表中?

   将数据放到hdfs制定文件夹下:hadoop fs -put 服务器上的文件存储路径/文件名称.txt hdfs://alg-hdfs/hdfs上路径
    将hdfs中的数据导入到hive中: load data inpath 'hdfs://alg-hdfs/hdfs上的路径/文件名.txt' overwrite into table browser.表名

5.Hive内外部表的区别?

    未被external修饰的是内部表【managed table】,被external修饰的为外部表【external table】。
    内部表数据由Hive自身管理,外部表数据由HDFS管理。
    内部表数据存储在hive.metastore.warehouse.dir【默认:/user/hive/warehouse】,外部表数据存储位置由用户自己决定。
    删除内部表会直接删除元数据【metadata】及存储数据,删除外部表仅仅删除元数据,HDFS上的文件不会被删除。
    对内部表的修改会直接同步到元数据,而对外部表的表结构和分区进行修改,则需要修改【MSCK REPAIR TABLE table_name】。

6.说说对桶表的理解?

    建表时指定了CLUSTERED BY,这个表称为分桶表!

    分桶: 和MapReduce中分区是一个概念! 是把数据分散到多个文件中!

    分桶本质上也是为了分散数据!在分桶后,可以结合hive提供的抽样查询,只查询指定桶的数据

    在分桶时,也可以指定将每个桶的数据根据一定的规则来排序
    如果需要排序,那么可以在CLUSTERED BY后跟上SORTED BY

桶表是对数据某个字段进行哈希取值,然后放到不同文件中存储。

数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。

桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。

7.hive有哪些保存元数据的方式,有什么特点?

    内嵌模式:将元数据保存在本地内嵌的derby数据库中,内嵌的derby数据库每次只能访问一个数据文件,也就意味着它不支持多会话连接。
    本地模式:将元数据保存在本地独立的数据库中(一般是mysql),这可以支持多会话连接。
    远程模式:把元数据保存在远程独立的mysql数据库中,避免每个客户端都去安装mysql数据库。

8.请谈⼀下hive的特点是什么?hive和RDBMS有什么异同?

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。相比于RDBMS,hive能支持亿级的数据查询操作,主要用于历史数据的转储和对业务数据库的解耦

9.Group By

默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。

并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。1)开启Map端聚合参数设置

(1)是否在Map端进行聚合,默认为True hive.map.aggr = true

(2)在Map端进行聚合操作的条目数目 hive.groupby.mapaggr.checkinterval = 100000

(3)有数据倾斜的时候进行负载均衡(默认是false) 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中),最后完成最终的聚合操作。

10.Hive有索引吗

Hive支持索引(3.0版本之前),但是Hive的索引与关系型数据库中的索引并不相同。并且 Hive索引提供的功能很有限,效率也并不高,因此Hive索引很少使用。

索引适用的场景:

适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索 引以构建索引表。

11.运维如何对hive进行调度

将hive的sql定义在脚本当中;

使用azkaban或者oozie进行任务的调度;

监控任务调度页面。

12.ORC、Parquet等列式存储的优点

- ORC:ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,文件中的数据尽可能的压缩以降低存储空间的消耗;以二进制方式存储,不可以直接读取;自解析,包含许多元数据,这些元数据都是同构ProtoBuffer进行序列化的;会尽可能合并多个离散的区间尽可能的减少I/O次数;在新版本的ORC中也加入了对Bloom Filter的支持,它可以进一 步提升谓词下推的效率,在Hive 1.2.0版本以后也加入了对此的支持。

- Parquet:Parquet支持嵌套的数据模型,类似于Protocol Buffers,每一个数据模型的schema包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名;Parquet中没有Map、Array这样的复杂数据结构,但是可以通过repeated和group组合来实现;通过Striping/Assembly算法,parquet可以使用较少的存储空间表示复杂的嵌套格式,并且通常Repetition level和Definition level都是较小的整数值,可以通过RLE算法对其进行压缩,进一步降低存储空间;Parquet文件以二进制方式存储,不可以直接读取和修改,Parquet文件是自解析的,文件中包括该文件的数据和元数据。

13.数据倾斜怎么解决

  • 空值引发的数据倾斜

  • 解决方案:
    第一种:可以直接不让null值参与join操作,即不让null值有shuffle阶段

  • 第二种:因为null值参与shuffle时的hash结果是一样的,那么我们可以给null值随机赋值,这样它们的hash结果就不一样,就会进到不同的reduce中

  • 不同数据类型引发的数据倾斜

  • 解决方案:
    如果key字段既有string类型也有int类型,默认的hash就都会按int类型来分配,那我们直接把int类型都转为string就好了,这样key字段都为string,hash时就按照string类型分配了

  • 不可拆分大文件引发的数据倾斜

  • 解决方案:
    这种数据倾斜问题没有什么好的解决方案,只能将使用GZIP压缩等不支持文件分割的文件转为bzip和zip等支持文件分割的压缩方式。
    所以,我们在对文件进行压缩时,为避免因不可拆分大文件而引发数据读取的倾斜,在数据压缩的时候可以采用bzip2和Zip等支持文件分割的压缩算法。

  • 数据膨胀引发的数据倾斜

  • 解决方案:
    在Hive中可以通过参数 hive.new.job.grouping.set.cardinality 配置的方式自动控制作业的拆解,该参数默认值是30。表示针对grouping sets/rollups/cubes这类多维聚合的操作,如果最后拆解的键组合大于该值,会启用新的任务去处理大于该值之外的组合。如果在处理数据时,某个分组聚合的列有较大的倾斜,可以适当调小该值。

  • 表连接时引发的数据倾斜

  • 解决方案:
    通常做法是将倾斜的数据存到分布式缓存中,分发到各个Map任务所在节点。在Map阶段完成join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜。

  • 确实无法减少数据量引发的数据倾斜

  • 解决方案:
    这类问题最直接的方式就是调整reduce所执行的内存大小。
    调整reduce的内存大小使用mapreduce.reduce.memory.mb这个配置。

14.Hive 小文件过多怎么解决

  •         使用 hive 自带的 concatenate 命令,自动合并小文件
  •         调整参数减少Map数量
  •         减少Reduce的数量
  •         使用hadoop的archive将小文件归档

15.Hive优化有哪些

  •         数据存储及压缩
  •         通过调参优化
  •         有效地减小数据集将大表拆分成子表;结合使用外部表和分区表
  •         SQL优化

16.Hive的两张表关联,使用MapReduce怎么实现?

如果其中有一张表为小表,直接使用map端join的方式(map端加载小表)进行聚合。

如果两张都是大表,那么采用联合key,联合key的第一个组成部分是join on中的公共字段,第二部分是一个flag,0代表表A,1代表表B,由此让Reduce区分客户信息和订单信息;在Mapper中同时处理两张表的信息,将join on公共字段相同的数据划分到同一个分区中,进而传递到一个Reduce中,然后在Reduce中实现聚合。

17.写出Hive中split、coalesce及collect_list函数的用法(可举例)?

split将字符串转化为数组,即:split('a,b,c,d' , ',') ==> ["a","b","c","d"]。

coalesce(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回NULL。

collect_list列出该字段所有的值,不去重 => select collect_list(id) from table。

18.Hive有哪些方式保存元数据,各有哪些特点?

Hive支持三种不同的元存储服务器,分别为:内嵌式元存储服务器、本地元存储服务器、远程元存储服务器,每种存储方式使用不同的配置参数。

内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。

在本地模式下,每个Hive客户端都会打开到数据存储的连接并在该连接上请求SQL查询。

在远程模式下,所有的Hive客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift协议通信。

19.Hive的函数:UDF、UDAF、UDTF的区别?

  • UDF:单行进入,单行输出
  • UDAF:多行进入,单行输出
  • UDTF:单行输入,多行输出

20.所有的Hive任务都会有MapReduce的执行吗?

        不是,从Hive0.10.0版本开始,对于简单的不需要聚合的类似SELECT from

LIMIT n语句,不需要起MapReduce job,直接通过Fetch task获取数据。

21.hive底层数据交互原理?

        Hive的查询功能是HDFS和MapReduce结合起来实现的,对于大规模数据查询还是不建议在hive中,因为过大数据量会造成查询十分缓慢,Hive与Mysql的关系:只是借用Mysql来存储hive中的表的元数据,成为metastore(元数据)。

22.Hive本地模式?

大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过有时Hive的数据数据量非常小的。在这种情况下,为查询触发执行任务是消耗,可能会比时间job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务,对于小数据集,执行时间可以面向被缩短。
可以通过hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化

23.Hive 中的压缩格式TextFile、SequenceFile、RCfile 、ORCfile各有什么区别?

1、TextFile

默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,压缩后的文件不支持split,Hive不会对数据进行切分,从而无法对数据进行并行操作。并且在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。

2、SequenceFile

SequenceFile是Hadoop API提供的一种二进制文件支持,存储方式为行存储,其具有使用方便、可分割、可压缩的特点。

SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

优势是文件和hadoop api中的MapFile是相互兼容的

3、RCFile

存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:

首先,RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低;

其次,像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取;

4、ORCFile

存储方式:数据按行分块 每块按照列存储。

压缩快、快速列存取。

效率比rcfile高,是rcfile的改良版本。

小结:

相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。

数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

24.Hive表关联查询,如何解决数据倾斜的问题?

1)倾斜原因:map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特、建表时考虑不周、等原因造成的reduce 上的数据量差异过大。(1)key分布不均匀; (2)业务数据本身的特性; (3)建表时考虑不周; (4)某些SQL语句本身就有数据倾斜;

如何避免:对于key为空产生的数据倾斜,可以对其赋予一个随机值。

2)解决方案

(1)参数调节: hive.map.aggr = true 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中),最后完成最终的聚合操作。

(2)SQL 语句调节:

① 选用join key分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表做join 的时候,数据量相对变小的效果。 ② 大小表Join: 使用map join让小的维度表(1000 条以下的记录条数)先进内存。在map端完成reduce。 ③ 大表Join大表: 把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。 ④ count distinct大量相同特殊值: count distinct 时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

25.Fetch抓取

Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。

在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。

26.小表、大表Join

将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用Group让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。

实际测试发现:新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别。

27.大表Join大表

1)空KEY过滤 有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。例如key对应的字段为空。

2)空key转换 有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。

28.Hive的建表方式

  在Hive中,你可以使用多种方式创建表,包括以下几种:

  1. 通过DDL语句创建表:使用`CREATE TABLE`语句来创建表,并指定表的名称、列定义以及其他属性。例如:

CREATE TABLE your_table (
column1 datatype1,
column2 datatype2,
...
)

   你可以根据需要定义列的名称和对应的数据类型。

  2. 通过已存在的表创建表(CTAS):使用`CREATE TABLE AS SELECT`语句根据已存在的表的查询结果来创建新表。语法如下:

CREATE TABLE new_table AS
SELECT column1, column2, ...
FROM existing_table

   这将根据查询结果创建一个新表,并复制已存在表中指定的列。

  3. 通过外部表创建表:使用`CREATE EXTERNAL TABLE`语句创建外部表。外部表与内部表不同,它们的数据存储在外部位置,并且在删除表时不会删除数据。语法如下:

CREATE EXTERNAL TABLE your_table (
column1 datatype1,
column2 datatype2,
...
)
LOCATION 'hdfs://path/to/external/table';

   你需要提供表的列定义,并指定外部表数据的存储位置。

  4. 通过复制现有表的元数据创建表:使用`CREATE TABLE`语句,并指定现有表的名称来创建一个具有相同结构的新表。但是,新表不会复制现有表中的数据。语法如下:

CREATE TABLE new_table
LIKE existing_table;

   这将创建一个与现有表具有相同结构的新表。

  这些是Hive中创建表的常见方式。你可以根据你的需求和数据来源选择适合的方式来创建表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值