当前位置: 首页 > news >正文

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

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

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

相关文章:

  • POI和EasyExcel
  • LeetCode---SQL刷题4
  • 【SpringMVC】注解开发
  • 语言基础 - 1
  • Word发布到分类内测试1
  • 150000人疯抢的证书究竟是何方神圣?
  • android使用tcpdump抓包
  • UNITY与旷世Face++☀️二、手势识别的实现
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • golang promethus consul 服务发现
  • 五年后端开发,仅考这份面试题和答案,成功涨薪到30k!!!
  • ISE的仿真库编译步骤——基于Omapl138/TMS320C6748+FPGA核心板
  • sql2java-pagehelper:参照Mybatis-PageHelper实现分页查询
  • 质量平台-sonarlint-idea本地配置及使用技巧
  • ansible入门
  • [deviceone开发]-do_Webview的基本示例
  • Date型的使用
  • HTTP请求重发
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • jQuery(一)
  • node入门
  • Python3爬取英雄联盟英雄皮肤大图
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0实现一个tiny react(三)生命周期
  • 搞机器学习要哪些技能
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于游标的分页接口实现
  • 盘点那些不知名却常用的 Git 操作
  • 前端js -- this指向总结。
  • 如何进阶一名有竞争力的程序员?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 异常机制详解
  • hi-nginx-1.3.4编译安装
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​第20课 在Android Native开发中加入新的C++类
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (差分)胡桃爱原石
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六)Hibernate的二级缓存
  • (转)甲方乙方——赵民谈找工作
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .pop ----remove 删除
  • /etc/sudoers (root权限管理)
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @ModelAttribute注解使用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析