精华内容
下载资源
问答
  • Hive面试题

    2021-01-08 10:05:59
    Hive面试题Hive高频面试题1.简述Hive的主要架构2.Hive和传统数据库有和区别?2.1.数据存储位置2.2.数据更新2.3.执行延迟2.4.数据规模3.Hive的内部表和外部表分别是什么?有什么区别?3.1.删除数据时:3.2.在公司生产...

    Hive高频面试题

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

    1.简述Hive的主要架构

    Hive元数据默认存储在derby数据库,不支持多客户端访问,所以需要将元数据存储在MySQl,以支持多客户端访问。主要架构如下:
    在这里插入图片描述

    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.数据倾斜长啥样?

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

    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表里的体现:
    在这里插入图片描述

    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。
    首先修改库的基字符集和数据库排序规则:
    在这里插入图片描述

    再使用 SHOW VARIABLES LIKE ‘%char%’; 命令查看参数:
    在这里插入图片描述
    确保这几个参数的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面试题

    2018-12-04 22:17:46
    自己整理的hive面试题,加上自己面试的时候遇到的面试题,整合到一起
  • Hive 面试题

    2019-11-28 20:17:58
    什么是Hive? Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并...

    什么是Hive?

    Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。

    Hive的意义(最初研发的原因)?

    降低程序员使用Hadoop的难度,降低学习成本

    Hive的内部组成模块,作用分别是什么?

    元数据:描述数据的数据
    内部执行流程:
    解析器(解析器SQL语句)、编译器(把SQL语句编译成MapReduce程序)、优化器(优化MapRedue程序)、执行器(将MapReduce程序运行的结果提交到HDFS)

    Hive支持的数据格式?

    TextFile、SequenceFile、RCFile、ParquetFile,orc格式

    进入Hiveshell窗口的方式?

    1、Hive命令直接进入HiveShell
    2、HiveJDBC方式使用beeline连接hiveserver2
    3、使用Hive命令参数直接执行hql语句

    Hive数据库、表在HDFS上存储的路径是什么?

    是由hive.site.xml当中的”hive,metastore.warehouse.dir“指定,默认在HDFS系统的 /user/hive/warehouse/ 文件夹下

    like与rlike的区别?

    like:like的内容不是正则,而是通配符(模糊匹配查询)
    rlike:rlike的内容可以是正则,正则的写法与java一样。

    内部表与外部表的区别?

    未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
    区别:
    1、内部表数据由Hive自身管理,外部表数据由HDFS管理;
    2、内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
    3、删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
    4、对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

    分区表的优点是,分区字段的要求是?

    优点:
    1、可以减少数据冗余
    2、提高指定分区查询分析的效率
    分区字段绝对不能出现在数据表以有的字段中。

    分桶表的优点是,分桶字段的要求是?

    优点:获得了更高的查询处理效率,桶为表加上了额外的结构,Hive在处理有些查询时,能利用这个结构
    分桶字段必须是表中的字段

    数据导入表的方式?

    1、load加载数据
    (linux) load data local inpath ‘/export/servers/hivedatas/score.csv’ overwrite into table score partition(month=‘201806’);
    (HDFS) load data inpath ‘/export/servers/hivedatas/score.csv’ overwrite into table score partition(month=‘201806’);
    2、直接向分区表中插入数据
    insert into table score3 partition(month =‘201807’) values (‘001’,‘002’,‘100’);
    3、多插入模式
    from score
    insert overwrite table score_first partition(month=‘201806’) >select s_id,c_id
    insert overwrite table score_second partition(month = >‘201806’) select c_id,s_score;
    4、查询语句中创建表并加载数据(as select)
    create table tbname2 as select * from tbname1;
    5、创建表时通过location指定加载数据路径
    create external table score6 (s_id string,c_id string,s_score int) row format delimited fields terminated by ‘\t’ location ‘/myscore6’;

    数据导出表的方式?

    1、将查询的结果导出到本地
    insert overwrite local directory ‘/export/servers/exporthive/a’ select * from score;
    2、将查询的结果格式化导出到本地
    insert overwrite local directory ‘/export/servers/exporthive’ row format delimited fields terminated by ‘\t’ collection items terminated by ‘#’ select * from student;
    3、将查询的结果导出到HDFS上(没有local)
    insert overwrite directory ‘/export/servers/exporthive’ row format delimited fields terminated by ‘\t’ collection items terminated by ‘#’ select * from score;
    4、Hadoop命令导出到本地
    dfs -get /export/servers/exporthive/000000_0 /export/servers/exporthive/local.txt;
    5 、 hive shell 命令导出
    bin/hive -e “select * from yhive.score;” > /export/servers/exporthive/score.txt
    6、export导出到HDFS上(全表导出)
    export table score to ‘/export/exporthive/score’;
    7、SQOOP导出(后面再学)

    order by与sort by的区别?

    order by:全局排序,一个MapReduce
    sort by:每个MapReduce内部进行排序,对全局结果集来说不是排序。

    where 与having的区别?

    where 作用在 分组(group by)和聚集(sum等)计算之前
    having作用在 分组(group by)之后,对分组后计算的数据进行过滤

    distribute by何时使用,通常与哪个联合使用?

    当需要根据某个字段进行分区时使用
    通常与sort by结合使用(先分区后排序)
    Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

    Cluster by何时使用?

    需要按照某个字段分区同时也按照这个字段进行排序时使用cluster by

    distribute by+sort by(相同字段) 与Cluster by的区别?

    distribute by+sort by:当distribute by和sort by字段相同时,就等价于cluster by,可以指定排序规则ASC或DESC。
    cluster by:除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是正序排序,不能指定排序规则为ASC或者DESC。

    hive -e/-f/-hiveconf分别是什么意思?

    -e:从命令行执行指定的 HQL
    -f:执行 HQL 脚本
    -hiveconf:hive相关配置属性

    hive声明参数有哪些方式,优先级是什么?

    参数声明 > 命令行参数 > 配置文件参数

    编写hiveUDF代码,方法名称叫什么?

    evaluate()

    企业中hive常用的数据存储格式是什么?常用的数据压缩格式是什么?

    常用的数据存储格式是:ParquetFile、ORC
    常用的数据压缩格式是:Snappy

    hive自定义函数的类型?

    1、UDF(User-Defined-Function)
    一进一出
    2、UDAF(User-Defined Aggregation Function)
    聚合函数,多进一处
    3、UDTF(User-Defined Table-Generating Functions)
    一进多出

    Fetch抓取中设置more有什么效果,设置none有什么效果

    简单的查询语句不会转化成为MR程序
    设置为后所有查询语句都要转化成为MR程序

    本地模式有什么好处

    在小数据量的前提下 提高了查询效率

    当一个key数据过大导致数据倾斜时,如何处理

    开启Map端聚合和功能开启局部聚合后 hive会创建两个MR 程序 第一个进行数据的局部聚合 第二个进行数据的最终汇总

    Count(distinct) 的替换语句如何编写

    先去重,再求总数量
    SELECT count(DISTINCT id) FROM bigtable;
    替换方案
    SELECT count(id) FROM (SELECT id FROM bigtable GROUP BY id) a;

    如何使用分区剪裁、列剪裁

    列剪裁: 只拿需要的列
    分区剪裁:只拿需要的分区
    要什么 拿什么

    如何理解动态分区调整

    以第一个表的分区规则,来对应第二个表的分区规则,将第一个表的所有分区,全部拷贝到第二个表中来,第二个表在加载数据的时候,不需要指定分区了,直接用第一个表的分区即可

    数据倾斜时,如何将众多数据写入10个文件

    众人拾柴火焰高(将一个大的任务拆分成多个小任务,再次执行)
    设置reduce数量10
    1:distribute by (字段)
    2 distribute by rand()

    影响map数量的因素

    文件很小时候:影响map数量的因素是文件数量
    文件很大时候:影响map数量的因素是块的数量

    reduce数量的计算是什么

    公式:
    N=min(参数2,总输入数据量/参数1)
    参数1:每个Reduce处理的数据量
    参数2:每个任务最大Reduce数量

    并行执行有什么好处

    并行执行使得多个没有依赖关系的任务同时执行,起到了提高查询效率的作用

    严格模式不能执行哪些命令

    1、不允许扫描所有分区
    2、使用了order by语句查询,要求必须使用limit语句
    3、限制笛卡尔积的查询

    JVM重用有什么好处

    允许多个task使用一个jvm
    降低了任务启动的开销,提高了任务的执行效率
    但是,在整个任务结束前,jvm不释放,长时间占用。导致资源不足时,资源浪费

    什么是MR本地模式

    数据存储到HDFS后,编写分析代码实现计算程序,程序在进行分发时,优先分发放到这个程序所使用到的数据所在的节点上。

    先join后过滤的优化方案

    1、SELECT a.id FROM ori a LEFT JOIN bigtable b
    ON (b.id <= 10 AND a.id = b.id);
    2、SELECT a.id FROM bigtable a RIGHT JOIN (SEL

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,588
精华内容 635
关键字:

hive面试题