【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(十四)
持续分享有用、有价值、精选的优质大数据面试题
致力于打造全网最全的大数据面试专题题库
131、hive性能调优的常见方法?
参考答案:
(1)HQL层面优化
1)利用分区表优化
2)利用桶表优化
3)join 优化
4) Group By 数据倾斜优化 解决这个问题的方法是配置一个参数: set hive.groupby.skewindata=true
5)Order By 优化
6)一次读取多次插入
7)Join 字段显示类型转换
(2)Hive架构层面优化
1)不执行MapReduc
2)本地模式执行MapReduce
3)JVM重用
4)并行化
(3)底层MapReduce优化
1)合理设置map数
2)合理设置Reduce数
132、Hive的join有几种方式,怎么实现join的?
参考答案:
(1)Hive中常见的join方式
Hive中除了支持和传统数据库中一样的内关联、左关联、右关联、全关联,还支持LEFT SEMI JOIN和CROSS JOIN,但这两种JOIN类型也可以用前面的代替。
(2)如何实现join?
1)内关联(JOIN) 只返回能关联上的结果。 SELECT a.id, a.name, b.age FROM djt_a a join djt_b b ON (a.id = b.id);
2) 左外关联(LEFT [OUTER] JOIN) 以LEFT [OUTER] JOIN关键字前面的表作为主表,和其他表进行关联,返回记录和主表的记录数一致,关联不上的字段置为NULL。 是否指定OUTER关键字,貌似对查询结果无影响。
SELECT a.id, a.name, b.age FROM djt_a a left join djt_b b ON (a.id = b.id);
3)右外关联(RIGHT [OUTER] JOIN) 和左外关联相反,以RIGTH [OUTER] JOIN关键词后面的表作为主表,和前面的表做关联,返回记录数和主表一致,关联不上的字段为NULL。 是否指定OUTER关键字,貌似对查询结果无影响。
SELECT a.id, a.name, b.age FROM djt_a a RIGHT OUTER JOIN djt_b b ON (a.id = b.id);
4) 全外关联(FULL [OUTER] JOIN) 以两个表的记录为基准,返回两个表的记录去重之和,关联不上的字段为NULL。 是否指定OUTER关键字,貌似对查询结果无影响。 注意:FULL JOIN时候,Hive不会使用MapJoin来优化。
SELECT a.id, a.name, b.age FROM djt_a a FULL OUTER JOIN djt_b b ON (a.id = b.id);
5) LEFT SEMI JOIN 以LEFT SEMI JOIN关键字前面的表为主表,返回主表的KEY也在副表中的记录。
SELECT a.id, a.name FROM djt_a a LEFT SEMI JOIN djt_b b ON (a.id = b.id);
6) 笛卡尔积关联(CROSS JOIN) 返回两个表的笛卡尔积结果,不需要指定关联键。
SELECT a.id, a.name, b.age FROM djt_a a CROSS JOIN djt_b b;
133、Hive内部表和外部表的区别?应该如何选择使用哪种表呢?
参考答案:
1)Hive 向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定,在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样。
2)在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的! 那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如果所有处理都需要由Hive完成,那么你应该创建内部表,否则使用外部表! 外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
134、hive怎么解决数据倾斜?
参考答案:
(1)group by
注:group by 优于 distinct group
情形:group by 维度过小,某值的数量过多
后果:处理某值的 reduce 非常耗时
解决方式:采用 sum() group by 的方式来替换 count(distinct)完成计算。
(2)count(distinct)
情形:某特殊值过多
后果:处理此特殊值的 reduce 耗时;只有一个 reduce 任务
解决方式:count distinct 时,将值为空的情况单独处理,比如可以直接过滤空值的行,在最后结果中加 1。如果还有其他计算,需要进行 group by,可以先将值为空的记录单独处理,再和其他计算结果进行 union。
(3)不同数据类型关联产生数据倾斜
情形:比如用户表中 user_id 字段为 int,log 表中 user_id 字段既有 string 类型也有 int 类型。当按照 user_id 进行两个表的 Join 操作时。
后果:处理此特殊值的 reduce 耗时;只有一个 reduce 任务默认的 Hash 操作会按 int 型的 id 来进行分配,这样会导致所有 string 类型 id 的记录都分配到一个 Reducer 中。
解决方式:把数字类型转换成字符串类型
select * from users a
left outer join logs b
on a.usr_id = cast(b.user_id as string)
(4)开启数据倾斜时负载均衡
set hive.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 中随机分布到各个节点完成。
(5)控制空值分布
将为空的 key 转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分不到多个 Reducer。
注:对于异常值如果不需要的话,最好是提前在 where 条件里过滤掉,这样可以使计算量大大减少。
135、hive底层与数据库交互原理?
参考答案:
Hive的查询功能是由hdfs + mapreduce结合起来实现的。
Hive与mysql的关系:只是借用mysql来存储hive中的表的元数据信息,称为metastore。