打怪升级之小白的大数据之旅(六十)
Hive旅程中的始发站
引言
- 经过了前面Hadoop、MR、Java、MySQL以及Linux的洗礼,接下来我们就要进入到大数据中特别重要的一个知识点学习–Hive,Hive是我们大数据日常工作中必不可少的一个技能,基本上许多有大数据部门的公司他们雇佣的大数据工程师就是利用Hive来完成他们的日常工作…
- 既然Hive这么重要,那么我们应该怎么学好它呢?别急,跟着我一起进入Hive的旅程吧
Hive始发站—Hive的地图
- 博客已经写到了第六十期了,看过我前面博客的小伙伴应该知道我的习惯,每次介绍一个新知识之前,我总会列出一个大的框架,然后再对框架中的内容进行讲解
- 因为Hive比较重要,所以我专门在开篇梳理一下Hive的整体学习地图,带着这个地图就可以从容地在Hive中旅行啦~
地图解释:
- Hive概述:
- 首先我们要了解Hive的基本概念,了解Hive架构原理,知道这些知识,我们就可以清晰地了解它的工作流程
- Hive安装:
- 接下来当然就是安装Hive了,因为它需要我们自己配置一些东西,所以我将它也纳入了地图之中
- Hive数据类型:
- 了解了Hive的原理以及安装好Hive,我们就要开始使用Hive了,当然,要想使用Hive,就需要了解它的数据类型
- DDL操作:
- Hive的操作就像我们操作Mysql一样,它也是通过sql来操作数据的,所以我们在操作数据前就需要知道怎么操作数据库与数据表
- DML操作:
- 学会了数据库与数据表的操作,我们就需要了解数据是如何导入、导出到Hive中的,所以我们DML操作主要就是学习数据的导入与导出
- 查询:
- Hive最重要的工作就是查询,前面的工作最终就是为了辅助我们进行这一段的旅程,查询这一块大家一定好好学习
- 分区表、分桶表:
- 因为是大数据,所以我们不可能对整个数据全部查询一遍,我们就要有分治的思想、所以我们要学习分区表和分桶表,有了它们可以更好地辅助我们进行查询
- 函数:
- 我们简单的查询当然不能满足需求,于是就需要学习高端操作–函数,让函数来解决一些查询中的疑难杂症
- 压缩和存储:
- 学习完前面的知识点,我们已经可以掌握Hive的使用了,但是为了提高工作效率,我们就需要学习一下数据的压缩和存储
- Hive调优:
- 调优就是锦上添花、画龙点睛必不可少的一部分,正如Hadoop最后的调优一样,合理的调优可以让我们飞起来~~~~
- Hive综合案例:
- 学习的最高效率就是实战、所以为了刚好的让大家吸收前面旅程中的种种风景,我为大家带来一个旅程相册集(Hive综合案例),通过综合案例可以更好的让我们查漏补缺
Hive概述
- 官方的解释是:Hive是基于Hadoop的一个数据仓库工具,可以将结构化数据文件映射为一张表,并提供类SQL的查询功能
- 一句话来形容Hive:将HQL转化为MapReduce程序
Hive架构原理
- 用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive) - 元数据:Metastore
- 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
- 默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
- 因为derby同时只允许一个客户端进行访问,所以使用Mysql可以进行多客户端进行访问
- Hadoop
- 使用HDFS进行存储,使用MapReduce进行计算。
- 驱动器:Driver
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark
Hive运行机制
一句话总结:Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口
Hive执行流程
上面介绍了Hive运行机制,接下来我来介绍一下客户端是如何操作Hive获取所需数据的
- 客户端通过CLI或者JDBC连接Hive后,根据业务来编写HQL语句
- 在Hive内部,封装了许多的MapReduce模板,这些模板用来实现SQL语言中的操作
- 当Hive接收到HQL语句后,会通过MetaStore和内部匹配相对应的MapReduce模板来执行对应的MapReduce程序
- 运行完成后,将结果返回给客户端
Hive优缺点
Hive的优点
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
- 避免了去写MapReduce,减少开发人员的学习成本。
- Hive优势在于处理大数据,支持海量数据的分析与计算。
- Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
Hive的缺点
- Hive的HQL表达能力有限
- Hive自动生成的MapReduce作业,通常情况下不够智能化
- 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。
- Hive的效率比较低
- Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
- Hive调优比较困难,粒度较粗
- Hive不支持实时查询和行级别更新
- hive分析的数据是存储在hdfs上,hdfs不支持随机写,只支持追加写,所以在hive中不能delete和update,只能select和insert
Hive和数据库比较
- 首先我们要知道数据仓库和数据的区别:
- 数据库仓库指的是一堆的数据库,它用于存储海量的数据,而数据库我们将它理解为一个用于存放数据的柜子
- 知道了数据仓库与数据库的区别,Hive和数据的区别就显而易见了,它们最大的区别就是数据规模,数据库支持的数据规模相对较小,而Hive建立在Hadoop集群上,所以Hive可以支持很大的数据规模
- 既然数据规模不同,那么它们的执行效率必然有所区别
- 因为Hive是通过Hadoop集群,并且它实际是执行MapReduce程序,所以它在执行执行规模小的数据时,会比较慢,而数据库因为有索引,索引它的速度会很快
- 因为执行慢,并且数据规模大,所以当我们将数据存储到HDFS中后一般就不再进行修改更新了,因此Hive的数据更新一般来说不建议使用,如果非要进行数据改写,可以从HDFS上下载数据,修改后再上传,而数据库因为数据规模小并且数据更新频率高,所以它会经常进行数据更新的操作
Hive的升级之路
为了更好的熟练学习掌握Hive,我将LeetCode中的HQL的练习题放到了github中,大家有需要的可以自行下载:https://github.com/GaryLea/BigDataTools
还有下面这两个网址中:
- 牛客sql实战 https://www.nowcoder.com/ta/sql
- Hive SQL50道练习题 https://mp.weixin.qq.com/s/k2VORfLxiu8wwQyHMaw_NA
- 注意一下:微信里这个它有一个BUG,它里面的原数据和表的定义是错误的,数据是空格分开,而表的定义是
/t
,大家自己改一下哈(这个知识点我会在DDL操作里讲)
总结
本章是Hive旅程的始发站,我们学习一个知识点之前就需要了解整个框架才可以了然于胸的进行学习,因此本章节主要是对Hive的一些介绍,Hive是大数据中我认为很重要的一个技能,大家要尽量多练习Hive中的HQL习题