前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据必知必会 | Hive架构设计和原理

大数据必知必会 | Hive架构设计和原理

作者头像
大数据梦想家
发布2021-10-22 14:59:59
1.4K0
发布2021-10-22 14:59:59
举报

前言

大家好,我是梦想家 Alex 。在上一篇文章 简单介绍 HDFS,MapReduce,Yarn 的 架构思想和原理,收获和反响还不错,那本篇内容,我们继续,本篇文章,我来为大家介绍 Hive 架构思想和设计原理。

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

Hive

我们在上一节讲到,MapReduce 虽然只有 map 和 reduce 这两个函数,但几乎可以满足任何大数据分析和机器学习的场景。不过,复杂的计算可能需要使用多个 job 才能完成,这些 job 之间还需要根据其先后依赖关系进行作业的编排,开发比较复杂。

在 Hadoop 出现之前,大部分的数据分析人员基本都用 SQL 语句分析数据库中的数据,如果让这些数据分析人员重新学习一下 Hadoop 支持的开发语言,将会耗费巨大的人力成本和学习成本。

所以,就有聪明的小伙伴想到,如果能根据 SQL 自动生成 MapReduce,就可以极大降低大数据技术在数据分析领域的应用门槛

基于这样的一个需求场景,Hive 横空出世。

Hive的架构

首先让我们来看下 Hive 的架构 。

在这里插入图片描述
在这里插入图片描述
  • Hive可以通过CLI,JDBC和 ODBC 等客户端进行访问。除此之外,Hive还支持 WUI 访问
  • Hive内部执行流程:解析器(解析SQL语句)、编译器(把SQL语句编译成MapReduce程序)、优化器(优化MapReduce程序)、执行器(将MapReduce程序运行的结果提交到HDFS)
  • Hive的元数据保存在数据库中,如保存在MySQL,SQLServer,PostgreSQL,Oracle及Derby等数据库中。Hive中的元数据信息包含表名,列名,分区及其属性,表的属性(包括是否为外部表),表数据所在目录等。
  • Hive将大部分 HiveSQL语句转化为 MapReduce 作业提交到 Hadoop上执行;少数 HiveSQL 语句不会转化为MapReduce作业,直接从DataNode上获取数据后按照顺序输出。

知晓了架构,我们接下来通过一条常见的 SQL 语句,来看看 Hive 是如何将其转换成 MapReduce 来计算的。

MapReduce 实现 SQL 的原理

代码语言:javascript
复制
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;

就像所展示的一样,这是一条很常见的 SQL 统计分析语句,用于统计不同年龄的用户访问不同网页的兴趣偏好,具体数据输入和执行的结果示例如图所示:

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

看这个示例我们就会发现,这个计算场景和 WordCount 很像。事实上也确实如此,我们可以用 MapReduce 完成这条 SQL 的处理。

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

这样一条很有实用价值的 SQL 就被很简单的 MapReduce 计算过程处理好了。

map 函数输出的 key 是表的行记录,value 是 1,reduce 函数对相同的行进行记录,也就是针对具有相同 key 的 value 集合进行求和计算,最终得到 SQL 的输出结果。

Hive要做的就是将SQL翻译成MapReduce程序代码。实际上,Hive内置了很多Operator,每个Operator完成一个特定的计算过程,Hive将这些Operator构造成一个有向无环图DAG,然后根据这些Operator之间是否存在shuffle将其封装到map或者reduce函数中,之后就可以提交给MapReduce执行了。

Operator 组成的 DAG 如下图 所示,这是一个包含 where 查询条件的 SQL,where 查询条件对应一个 FilterOperator。

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

值得注意的是,有些 HiveQL 语句不会被 Hive 转化成 MapReduce 作业,Hive 只会从 DataNode 将数据获取到了之后,按照顺序依次输出。

代码语言:javascript
复制
select * from user;

Hive 如何实现 join 操作

除了上面这些简单的聚合(group by)、过滤(where)操作,Hive 还能执行连接(join on)操作。

比如现在来了一个需求。

有 2 张表,一张 是 page_view 页面浏览记录表,一张是 user 用户表

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

如果我想收集到每个页面浏览用户的age信息,该如何获取。

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

很明显,这两张表都有一个相同的字段 userid,根据这个字段可以将两张表连接起来,生成我们最终想要的结果表 pv_users ,SQL 命令是

代码语言:javascript
复制
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);

同样,这个 SQL 命令也可以转化为 MapReduce 计算,连接的过程如下图所示。

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

从图上看,join 的 MapReduce 计算过程和前面的 group by 稍有不同,因为 join 涉及两张表,来自两个文件(夹),所以需要在 map 输出的时候进行标记,比如来自第一张表的输出 Value 就记录为 <1, X>,这里的 1 表示数据来自第一张表。这样经过 shuffle 以后,相同的 Key 被输入到同一个 reduce 函数,就可以根据表的标记对 Value 数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是 join 的结果。

所以我们如果打开 Hive 的源代码,看 join 相关的代码,会看到一个两层 for 循环,对来自两张表的记录进行连接操作

Hive命令说明

在 Hive 提供的所有连接方式中,命令行界面是最常见的一种。用户可以使用 Hive 的命令行对 Hive 中的数据库,数据表和数据进行各种的操作。

关于 Hive 命令使用的小技巧,可以看这篇文章👉《关于Hive命令的7个小技巧,你都清楚吗?》

关于Hive 查询的 18 种姿势,可以看这篇文章👉《Hive查询的18种方式,你都学会了吗?》

Hive函数使用

Hive内部支持大量的函数,可以通过 SHOW FUNCTIONS 查看Hive的内置函数。灵活地运用 Hive 提供的函数能够极大地节省数据分析成本。Hive函数主要包含数学函数集合函数类型转换函数日期函数条件函数字符串函数聚合函数表生成函数等。

因为内容过多,篇幅有限,我就展示部分内容。

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

微信关注 大数据梦想家 公众号,后台回复 “hive” 即可解锁 “hive 函数大全”

Hive 调优

调优向来都非常重要,无论是面试复习,还是实际工作,都少不了和它打交道。

例如,从建表设计层面,我们可以考虑到利用分区表/分桶表优化,选择选择合适的压缩格式

从 HQL语法和运行参数层面,我们可以采用 查看Hive执行计划列剪裁谓词下推分区剪裁合并小文件 等方式 …

从 Hive架构层面,我们可以采用 启用本地抓取本地执行优化JVM重用并行执行 等方式 …

因为这部分内容如果展开来写确实非常多,不利于阅读,正好我自己收集了一本《Hive性能调优实战》,里面的内容非常干货,从环境搭建,到深入MapReduce引擎分析 … 最后一章,还介绍了Hive知识体系

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

这本书的电子版,体贴的我也为大家整理好了,关注 大数据梦想家 公众号,后台回复 “hive调优” 即可解锁 “hive 性能调优指南” .pdf

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

最后,附赠一张马中华老师亲绘的 Hive 的SQL编译源码详解 。

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

巨人的肩膀

「1」《从零开始学大数据》 「2」《大数据平台架构与实现》 「3」《架构师的自我修炼》 「4」https://blog.csdn.net/weixin_44318830/article/details/103739758 「5」https://blog.csdn.net/zhongqi2513/article/details/107153698

尾声

在实践中,工程师其实并不需要经常编写 MapReduce 程序,因为网站最主要的大数据处理就是 SQL 分析,也因此 Hive 在大数据应用中的作用非常重要。

后面随着 Hive 的普及,我们对于在 Hadoop 上执行 SQL 的需求越加强烈,对大数据 SQL 的应用场景也多样化起来,于是又开发了各种大数据 SQL 引擎。

例如 Cloudera 也开发了 Impala,这是一种运行在 HDFS 上的 MPP 架构的 SQL 引擎。和 MapReduce 启动 Map 和 Reduce 两种执行进程,将计算过程分成两个阶段进行计算不同,Impala 在所有 DataNode 服务器上部署相同的 Impalad 进程,多个 Impalad 进程相互协作,共同完成 SQL 计算。在一些统计场景中,Impala 可以做到毫秒级的计算速度。

还有后面我会为大家介绍的 SparkSQL,此外,大家还希望在 NoSQL 的数据库上执行 SQL,毕竟 SQL 发展了几十年,积累了庞大的用户群体,很多人习惯了用 SQL 解决问题。于是 Saleforce 推出了 Phoenix,一个执行在 HBase 上的 SQL 引擎 …

Hive 本身的技术架构其实并没有什么创新,数据库相关的技术和架构已经非常成熟,只要将这些技术架构应用到 MapReduce 上就得到了 Hadoop 大数据仓库 Hive。但是想到将两种技术嫁接到一起,却是极具创新性的,通过嫁接产生出的 Hive 可以极大降低大数据的应用门槛,也使 Hadoop 大数据技术得到大规模普及

更多精彩内容关注 👇「大数据梦想家」🔥: 一枚喜欢阅读,输出,复盘的大数据爱好者。热衷于分享大数据基础原理,技术实战,架构设计与原型实现之外,还喜欢输出一些有趣实用的编程干货内容,与阅读心得 …

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Hive
    • Hive的架构
      • MapReduce 实现 SQL 的原理
        • Hive 如何实现 join 操作
          • Hive命令说明
            • Hive函数使用
              • Hive 调优
              • 巨人的肩膀
              • 尾声
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档