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

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

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

  • 相关阅读:
    Shell脚本使用jq解析json
    数据库系统原理与应用教程(060)—— MySQL 练习题:操作题 11-20(四)
    springboot集成flowable简单实例入门
    《Linux高性能服务器编程》--高级I/O函数
    C++笔记之不同buffer数量下的生产者-消费者机制
    vue.config.js 多环境配置
    bugku 秋名山车神
    Log4j日志级别及使用规范
    漏洞发现-web应用发现探针类型利用(43)
    JSP学生选课管理系统myeclipse开发sql数据库BS模式java编程网页结构
  • 原文地址:https://blog.csdn.net/dajiangtai007/article/details/126526058