大数据必知必会|hive架构设计和原理(代码片段)

大数据梦想家 大数据梦想家     2023-01-11     770

关键词:

前言

        大家好,我是梦想家 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 的原理

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 将数据获取到了之后,按照顺序依次输出。

select * from user;

Hive 如何实现 join 操作

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

        比如现在来了一个需求。

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

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

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

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 大数据技术得到大规模普及

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

架构师必知必会系列系统架构设计需要知道的5大精要(5systemdesignfundamentals)...(代码片段)

无论是在大厂还是初创公司,技术产品经理(TPM)都需要具备系统设计的基础知识。从历史上看,系统设计基础知识通常是软件工程师在面试时的要求,而TPM不受此期望的约束。然而,现在趋势正在发生变化。作为TP... 查看详情

hive必知必会(代码片段)

hive: 基于hadoop,数据仓库软件,用作OLAPOLAP:onlineanalyzeprocess 在线分析处理OLTP:onlinetransactionprocess在线事务处理 事务: ACID A:atomic 原子性 C:consistent 一致性 I:isolation 隔离性 D:durability 持久性 1读未提交   脏读 //事务... 查看详情

mysql必知必会(代码片段)

姊妹篇——Hive必知必会(数据仓库):https://hiszm.blog.csdn.net/article/details/119907136文章目录第一章:数据库基础基本概念什么是SQL第二章:MySQL简介第三章:了解数据库和表第四章:检索数据SELECT语句第五章:... 查看详情

大数据必知必会的-linux命令(代码片段)

用户的创建和删除命令用户创建和密码设置useradd用户名passwd用户名useradditheima#创建新用户itheimapasswditheima#设置用户itheima密码用户删除user-r用户名userdel-ritheima#删除用户itheima权限管理命令文件权限概述Linux操作系统是多任务多用... 查看详情

大数据必知必会的-linux命令(代码片段)

用户的创建和删除命令用户创建和密码设置useradd用户名passwd用户名useradditheima#创建新用户itheimapasswditheima#设置用户itheima密码用户删除user-r用户名userdel-ritheima#删除用户itheima权限管理命令文件权限概述Linux操作系统是多任务多用... 查看详情

架构师必知必会常见的nosql数据库种类以及使用场景(代码片段)

前言NoSQL数据库是构建高并发大数据互联网应用的必备组件,熟悉理解各种类型nosql数据的特点和应用场景,对提高架构能力有巨大帮助,是高级后端架构师必须理解的知识点。NoSQL不是一个工具,而是由多个互补... 查看详情

大数据必知必会:hadoop单机环境安装(代码片段)

(大数据必知必会:Hadoop(1)单机环境安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情

大数据必知必会:hadoop高可用集群安装(代码片段)

(大数据必知必会:Hadoop(4)高可用集群安装)安装前准备高可用集群环境下,至少需要3台服务器,这里准备5台。IP地址主机名称角色10.0.0.5node1JournalNode、NameNode、ResourceManager10.0.0.6node2JournalNode、NameNode、ResourceManager10.0.0.7node3Journa... 查看详情

大数据linux必知必会-02(代码片段)

8网络配置8.1静态ip设置配置文件地址:/etc/sysconfig/network-scripts/ifcfg-ens33修改如下原来改成reboot重启下生效8.2修改linux主机名修改配置文件下的主机名/etc/hostname[root@hadoop~]#vim/etc/hostname修改映射文件/etc/sysconfig/network[root@hadoop~]#vim/etc 查看详情

mysql必知必会语法和基础知识大总结(代码片段)

...f08;不可重复,不允许nullmysql:基于客户-服务器的数据库系统使用mysqlmysql是部署在主机上的,可以通过ssh建立mysql连接#显示数据库showdatabases;#选择数据库usedatabases;#显示库中的表showtables;#显示表中的列showcolumnsfrom[t 查看详情

mysql必知必会语法和基础知识大总结(代码片段)

...f08;不可重复,不允许nullmysql:基于客户-服务器的数据库系统使用mysqlmysql是部署在主机上的,可以通过ssh建立mysql连接#显示数据库showdatabases;#选择数据库usedatabases;#显示库中的表showtables;#显示表中的列showcolumnsfrom[t 查看详情

大数据必知必会:hadoop伪分布式安装(代码片段)

(大数据必知必会:Hadoop(2)伪分布式安装)安装前准备操作系统准备本次安装采用的操作系统是Ubuntu20.04。更新一下软件包列表。sudoapt-getupdate安装Java8+使用命令安装Java8。sudoapt-getinstall-yopenjdk-8-jdk配置环境变量。vi~/.bashrcexportJAVA... 查看详情

必知必会的设计原则——合成复用原则(代码片段)

 设计原则系列文章 必知必会的设计原则——单一职责原则必知必会的设计原则——开放封闭原则必知必会的设计原则——依赖倒置原则必知必会的设计原则——里氏替换原则必知必会的设计原则——接口隔离原则必知必... 查看详情

大数据必知必会的-linux命令(代码片段)

终端命令格式command[-options][parameter]说明:command:命令名,相应功能的英文单词或单词的缩写[-options]:选项,可用来对命令进行控制,也可以省略parameter:传给命令的参数,可以是零个、一个或者多个显示文件列表命令ls是英文单词list的简... 查看详情

大数据必知必会的-linux命令(代码片段)

终端命令格式command[-options][parameter]说明:command:命令名,相应功能的英文单词或单词的缩写[-options]:选项,可用来对命令进行控制,也可以省略parameter:传给命令的参数,可以是零个、一个或者多个显示文件列表命令ls是英文单词list的简... 查看详情

大数据必知必会的-linux命令(代码片段)

文件操作命令touch命令touch命令创建文件touch文件路径toucha.txt#在当前目录创建a.txt文件touch/root/a.txt#在/root目录创建a.txt文件mv命令通过mv命令可以用来移动文件或目录,也可以给文件或目录重命名1)将文件移动另一个目录中࿱... 查看详情

大数据必知必会:hadoop分布式集群环境安装(代码片段)

(大数据必知必会:Hadoop(3)分布式集群环境安装)安装前准备集群环境下,至少需要3台服务器。IP地址主机名称10.0.0.5node110.0.0.6node210.0.0.7node3需要保证每台服务器的配置都一致,以下步骤在3台服务器上都需要做一次。操作系统... 查看详情

大数据必知必会系列__面试官问能不能徒手画一下你们的项目架构[新星计划]

文章目录引言一.ETL架构及Kudu框架二.OGG及Canal数据同步架构图总结引言大家好,我是ChinaManor,直译过来就是中国码农的意思,俺希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,一个平凡而不平庸的人。学习大数据差不多... 查看详情