【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。

持续分享有用、有价值、精选的优质大数据面试题

致力于打造全网最全的大数据面试专题题库

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值