HBase&Hive 2(一)|学习笔记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云解析 DNS,旗舰版 1个月
简介: 快速学习 HBase&Hive 2(一)

开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:HBase&Hive 2】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/75/detail/15847


HBase&Hive 2(一)

 

内容介绍:

一、Hive 是什么

二、读模式与写模式

三、artitions and buckets 分区和桶

四、常用的语法

五、云计算

 

一、Hive 是什么

1.简介

Hive 是什么? Hive 是在 Hadoop 之上建立的数据仓库数据仓库能够把各种的数据整合到里面统一地处理。因此它和数据库的区别是其支持的数据来源一般有多个,关系型数据库以及关系型数据库里的表,数据源来自 PDF 文件、 CSV 文件等等,它整合到数据仓库里以后,体现出来的效果立体的不像关系型数据库那样是二维的数据,可以在里面各个维度的切片分析,因此这是 Hive 的基本的用法。

image.png

在把数据导进Hive 之后,它提供了一种类似于 SQL 的语句,它叫 HQL 其中 H 是 Hive 的意思, Hive 的一种像 SQL 的一种语句,可以在上面进行查询。

整个 Hive 也像 HBase 一样,它是存储在 HDFS 之上。 HDFS 储存文件实际上是被切分了很多小文件,每一位很多,这些块在存储到 Linux 上或者是底层的其文件系统上一个个小文件, HDFS 管理大文件和小文件之间的映射关系,这为所谓的 Hive 

 image.png

Hive 会把导进来的多种数据源的数据存储到它的一种叫表里面。它在表上面可以作为像 MapReduce 这样的并行的操作。因此可以在 Hadoop 的集群上去执行 MapReduce 操作。操作类似 SQL 的查询,它把 SQL 的查询就转换一组 Hadoop 集群之上,因此会比较快。它里面这些表就有元数据去描述它 schema  这些信息就存在整个数据库里面称为 metastore 的库里。因此这和关系型数据库很像,有专门的存所有其的库的一些元数据,主要是在存储库和表的 schema 下面为具体的例子。

2.例子

前面我们讲 hadoop 所看到的那个天气预报的数据类似,因为它是组织表的因此可以Hive 里面去用类似于创建表的语句来创建

 image.png

create table  +  name 。由于它不是关系型数据库。存储,它不像关系型数据库那样做一系列,它可以按行存储,按列存储等等可以直接指定银行的。记录是按照行来进行,一行表示一条记录。在这条记录里面,三列用 tab 键分隔。因此它和关运营数据库里面不太一样。在关系型数据库里面,我们只需要指定到这里。

 image.png

当然还有主键或者是其,都是在描述这表的它的 schema 不会去描述底下这两块。

image.png

在关系型数据库里面,实际上是按列存储还是按行存储,这件事情是透明的,不需要管,假设想自己创建支持按列存储的关系型数据库,那么不需要去对 SQL 的语句做任何修改,因为 SQL 的语句本身没有指定这些是透明的,用户不需要关心。

但在 Hive 的世界里面,它就不是这样, Hive 要去管理说明。因此它在这里会说清楚,是按行存储,行里面的每一列按制表符去区分,

image.png

这样就可以看到,那它的数据库类似纯文本的数据库,它是在用这种方式存储内容。

3.内容从哪里来?

前面只是定整理好了一张表,这张表实际上是空的。如果要把这张表里的内容给填进去,那可以用导入的方式它加载。它加载的后面是表示要加载的文件在哪里。例如是 sample.txt 文件,加载进来去把这张表里已有的内容覆盖掉。

image.png 

后半部分和关系型数据库很像,前面的是在指定要从哪个文件里导数据。那么导进来,那它可能不是 TXT 的,是 PDF 的或者 CSV 的,则将要有相应的一些配器去读它们,按照刚才定义的表格的结构去把表存进去。一行表示一条记录,字段之间是靠制表键制表符来区分。

还要注意的一点是,这条语句只是在告诉 Hive 把文件加载到数据仓库的目录里头。刚才创建表,实际上是在数据仓库里面创建了表,在加载它,实际上它只是把文件放到了数据仓库的目录里面。放进来

image.png

没有解析文件内容,例如年份温度和温气没有解析出来,也没有真正存刚才那个表的格式。

那么这是什么意思?

意思是说现在要做的这件事情,只是把文件拷了过来,解析这件动作和存储这件动作,还没有做

什么没有做?

因为要做的事情是首先是把文件放到了目录里,也就意味着原来的指定的文件不会直接对做任何修改,不会被 Hive 做修改,内容会被放到 database 的目录里,并没有解析内容没有按照刚才指定的顺序存储动作。

什么没有按照刚才指定的顺序存储动作?

因为与 Hive date 做的动作类似,是一种 lazy 的方式。在执行这条语句,它知道将来数据仓库里会有文件,但是不会任何的处理,,一直到要去访问里面的内容,才会处理。原因是其默认的文件会很大,去解析存储这样的动作会花很多间,做完之后,用户未必马上就要去访问。所以预先把开销执行掉,没有意义。因此它用了一种 lazy 的方式在执行。

image.png

刚才是配置文件里当前的 Hive 所有的数据仓库的内目录在哪里。因为刚才创建的是 records 的表

image.png

因此它会创建叫 records 的目录。它会把刚才目录里 sample.tsc 直接拷进来放进目录。现在目录就包含了信息,未来要去读取 records 里面的内容,它就会去解析这里的内容,拿到 sample 里的东西。按照逻辑。因此目录里头现在看起来只有文件。但是以后可以放很多个文件,甚至可以来自不同的文件格式,来自不同的地方。

4.什么时做解析的动作?

Hive 的命令行工具里面,要执行 hql 查询语句。它很像 SQL 从 records 里面要去读温度,不等于9999。因为,一开始它是9999,真正的温度附进去。如果是9999,表示温度实际上没有测到。温度不等于9999,并且质量相当于这几个当中的一个。在情况下,把满足这些条件的最大的那个温度拿出来,同时把 对应的年份拿出来。

image.png

背后做的是什么事情?在 Hive 所在 hadoop 的集群上,把这件事情就拆分MapReduce 的作业。作业一般有若干个 map 若干个 reduce 每可以去处理文件。例如刚才看到的 sample.txt 那是其中之一。处理一个文件,最后得出结果。地方为它的输出。

1949 111

1950 22

因此当在执行动作,真正地要去到 sample.ts 里面去抓取想要的内容。因此通过 Hive 的 shell 运行了刚才的代码,那么在运行 high Hive 之后,会看见里面有一些命令,元数据都在这里

image.png

为它的命运行 shell 命令还有一些其的。例如有 web 的界面的,有写 Java 的客户端的代码,要应用依赖运行 Hive 把它运行为 server 通过 Hive server 对象运行 server 起来,去读写数据通过它去操作。实际上所有的数据最终是存在数据库里

5.数据库里是怎么存的?

它的存储有 metastore database 有关 touch 对它的抽象。

image.png

存整个 Hive 里面所有的数据仓库的信息,其的数据全部都是存储在 hadoop 的集群上。那么真正的那些数据仓库的东西,通过分布式文件系统访问到它。对分布式文件系统里面存储的数据仓库在做操作,实际上是通过之前看到的 MapReduce 那个 job client 操作,因此它会去驱动 job client 提交 MapReduce 索引,在 hadoop 的集群上去执行整个数据仓库上的处理。所有东西都是通过所谓的 Driver 来实现。当我们起命令行的 shell 或者使用 web 界面的控制台,它其实都是把命令发送给了 Driver 处理

6.数据导入如何进行操作?

数据导入以后存储进行操作。如果是用编程方式进行操作,在用户眼里看到的 Hive 整个就像数据源。因此它会提供类似 JDBC 的 Hive 的驱动。如果用 ODBC 就会 ODBC 的 Driver 如果用 Thrift 就用 Thrift 客户端。这是真正写的应用。因此可以看到在我们写的应用的眼里,整个 Hive 就像数据库它背后发生的是这样的事情。

image.png

metadata 非常重要。是相当于 Hive 里面所有元数据的集中存储的存储Metadatametastore 里面就会提供服务,并且后面的是真正存储的数据,存所有的数据仓库的数据以及数据仓库的元数据Metastore 的 service 通常和Hive service和 Driver运行在一起,这样它的性能,因此它们运行在虚拟机里当然也可以分开,分开之后把它在单独的进程里去运行那么Hive service和 Driver在单独进程里运行例如面对比较大的操作数据仓库,信息要单独存储,防止边崩了所有的数据都损坏。总的来说它是在存元数据。类似在分布式文件系统里面 name node 假设想去操作系统的话,首先要到 Meta Storee 到里面去所有的数据仓库的一些元数据,才能知道怎么到分布式文件系统里面去访问它。那因此我们看到它的部署会是这样的,甚至可以只一个。

 image.png

例如在集群里面比较复杂的情况下。一种是它只有它一个另一种是它HiveDriver 在一起,或者是在集群里运行,它和 Driver 还是运行在同一个Java虚拟机里,但是它有多个实例

更复杂的情况这两个 Meta Storee 是两个单独的进程,和 Driver 运行在不同的进程里,这种情况下做负载均衡一般会更好这是运行的机制。

 

二、读模式与写模式

1. schema on read 与 schema on write 的差异

我们把 Hive 里面数据在加载之后,数据是不是马上就被解析存储?那按照解析存储的方式的时间点的不同,我们还可以把它分两种,一种称为 schema on read 一种叫 schema on write 

两个的差异是什么?在传统的数据库里面, MySQL 这样的关系型数据库里,如果给表定义了 schema 也那个表的结构,那表的结构是当有数据被加载进来,也要写入到数据,无论是通过 SQL 语句导入,还是人工一套一套往里插,在加载数据,它就会去检查。例如主键要求不能为空,假设没有规定,除非设主键是数据库自增的或者是数据库帮我们生的,否则它会报错。

例如定义某字段。例如定义人的姓,字段是不能为空的。但是当在插入一条数据,它为空会报错。因此称为在数据加载了之后,它被强制约束了。因此如果数据不允不符合 schema 它就直接被拒绝报错。就称为 schema on right 当数据一旦加载,

image.png

就马上检查只有符合要求的数据,才能写入到数据库里面。因此它是在写入数据库时去这样的事情,这就叫 schema on readHive 把数据在 load ,它只是把文件放到了目录底下。没有解析和存储的动作,它只把文件放到了这里。Hive不做任何事情说明它一定不做数据 schema 的校验,文件放在那里。是当真正产生 query

image.png

前面动作。当把数据导入真正执行 select 返回去做数据校验。称为读取做校验,这就是两者的差异。

2.schema on read 它的好处

schema on read在load非常快,只是把文件拷过来,甚至不用拷,只需设置加载文件的引用,记住文件的位置即可因此schema on read初始加载非常它不需要做所谓的读取解析,把它再写回到硬盘,按照数据库的内部的格式写回到硬盘,因此它初始动作非常快。那么

3.schema on Redis 它的优势

schema on Redis 它的优势一开始就校验好,再做 query 之后不需要进行数据的校验,

image.png

因此性能非常。那这是我们看到的它的。而且它在数据在加载进来之后,它额外的还可以做一些事情,例如去索引或做数据的压缩,这样做完之后它就进一步提升 query 的性能。占用的磁盘空间少了或者是索引会使查询效率变快,会进一步地提升性能。那就看两者觉得哪更重要。

Hive 里面为什么取方式?原因是 Hive 是数据仓库,数据仓库就隐含着特点是它的数据量一定会非常大,而且它的数据的来源一般非常杂,如果一开始就校验,那它这校验耗时会非常的多,那么它一般会花费很大的精力在这里做这件事情,而且做完之后也不一定马上就会被用到。

于是跟这两种方式做对比,就可以认为像 xmail 解析里面的 DOM 它是数据在解析它之前是把所有数据全拿进来,建好一棵 DOM 树放到内存里。在后面会将在这棵 DOM 树里内存的 DOM 树里去获取我想要的。因此它的缺点是一开始建 DOM 树会花大量间。整个 DOM 树建好放到内存里用不用都在那里,它会占用内存。但是如果频繁的是在解析处理 xmail 会比较理想,因为后续所有操作全部都在内存里发生。

而上面就相当于是 sex 它基于事件来进行操作,文件放到这里,当要查询就去校验,不会一开始进来对整个 xmail 的文件建一棵树。当要去获取里面的内容,就去按流式数据一样去读 XML 文件。触发了事件之后,可以获取当时的一些信息,那它就相当于用 sex 做数据的校验这件事情是要花时间的。cost 是把它平摊到以后的所有的查询里,当遇到 Hive 就选的是前者把它平摊到后面的 query q 里面去。而一般的关系型数据库都走的是后面途径,把它一开始做完,保证后面所有查询都比较快。

4. Hive QL 举例

SQL 和 Hive QL 做对,可以看到它看起来很像 SQL 语句,但是它没有SQL 语句

image.png

 Hive 在定义时需要定义数据在这张表里的存储格式。数据真正在存文件是存到数据库表的文件里面之后,们是在 HDFS 上面去存储的,也就在一种分布式文件系统里存的。当然它不一定一定要强制约束HDFS 可以是其的文件系统。既然 Hive 在 hadoop 之上, hadoop 支持底下运行在其的文件系统之上,因此底下是什么系统它就用什么系统,而没有彻底绑定。存的元数据是存到了关系型的数据库里,就 match data 它并没有在 HDFS 里面。

Hive 里面内容为啥要把它划开?

因为实际上是在一种关系型数据库里存储了整个元数据,真正的数据仓库是在 sdfs 上存储的,因此是做了区分。道理很简单,源数据既然是所有的请求进来,都必须先去找源数据才能够对处理。当然这件事情对我们是透明的。

如图

image.png

它实际上是提交了 Hive 的 QL  QL 会被 Driver 去处理, DriverHive 的 service。它怎么处理的对我们来说是屏蔽的,它就是在通过这样的方式处理。很显然关系型数据库它的搜索效率一定会比 HDFS 高,而它是每请求进来都要访问,因此应该保证它的性能,因此它存在关系性数据库里。

image.png

可以看到是由 Hive 来管理的,但是可以这些表存储到数据仓库的目录里,也可以创建外部表。外部表的含义是告诉 Hive 数据它是在数据仓库之外的某目录里头存储的,要去引用它。因此即所谓的在它目录里的这些表和外部的表

那它两个有啥差异?

在数据仓库目录里存储的这些表是受 Hive 的管理的。元数据管理,以及分布式文件存储。如果要一些相应的数据管理的操作,都在目录里的全部是被管理的。如果是在目录之外有表,那只能去访问到那个数据,数据它也许在其的文件系统上。对文件的管理就弱了,就超出了 Hive 的范围,只知道我只能去读它,把它里面数据拿出来去作为数据仓库的数据源去进行处理。其的对文件的一些在文件系统之上做的一些复杂操作已经超出了 Hive 的能力范围。但是它支持多数据源,支持异构的数据源。数据导入之后,跟关系型数据很像方面数据量很大,它也可以进行分区,可以指定分区。

 

三、Partitions and buckets 分区和桶

加载非常大的文件,可以看到文件拿来之后它的分区是什么我有一系列的文件,例如 file 1 file 2 file 3 等等,

image.png

我会说 file 1 里面存储的是有关英国的天气预报,它加载进来之后是放到了表里面。但是进来之后数据只是其中的分区之一。其标注一些标记,表示日期国家等。 file 2 进来还是在 logs 表里,但是它另外分区那这些文件一旦被加载,从逻辑上来说,它们都在表里面, logs 表里面,但是它实际上是有多个分区的,那它速度就会它的存储自然就可以分不开,它就会处理就可以我们说的 Mac reduce 并行地处理

因此在一开始创建 logs 表就会去标注清楚是分区的,

image.png

在导入文件,可以去导入的文件一个分区,它的列或指定列的取值什么,这样所有的分区就能够区分开。

在逻辑上的分法分完之后,那 file 1 如果还是很大怎么办?真正地在物理上在存储为称为 buckets 的。因此 partition 是逻辑上分区。这是英国的 2001 年的天气预报的数据

 image.png

但文件本身很大。例如有个 5 个 GB 那实际上存储之后如果 5 个 GB 存储是非常大的,它要分很多小块存储。就像我们在 HDFS 里面讲的那个 block 一样,

image.png

它再分的话就称为 buckets 那为什么我们不能把 5 GB 的文件 partition 直接丢给 HDFS 让它直接把切开很多小块地存储

如果是这么做,会有问题,很大的文件切完之后,它们存储,它们在硬盘上的位置,在集群里位置一般就会发生变化,就们不会连续存储。此时要注意 HDFS 怎么管理,例如会存到服务器 A 上,这是 A 上,这是 B 上,这是 B 上,这是 C 上,这是 D 上,

image.png

这件事情已经完全不受控制。一般效率会比较低。这件事情到底分多少块,每一块在哪里完全不受控制。

但是如果人为地去把它化HDFS 之上,主动在 Hive 的层面上把它化很多小块,就有机会添加一些额外的信息进去,这些信息有助于提高搜索的效率。那例如用户表,

image.png

有用户的 ID 和名字,把 ID 做一下聚类,按照 ID 的升序进行排序,把它们划分四块四个 buckets 这种情况下看可以保证这四个 buckets 们是按照 ID 的升序排序完以后去进行了划分。在进行存储就不会出现把整个 5 GB 的空间文件拿过来后给 HDFS 区分HDFS 在进行分割,它可是只管文件的顺序上切。例如数据在这张表里的顺序,它本来是 ID 为 1 的人叫 Tom ID 为 100 的人叫 jerry ID 为 42 的人叫caocao, ID 为 101 叫liubei, ID 为 50 的人叫sunquan。

如果不靠 buckets 的区分,说我就丢给分布系统那么其分的效率就非常低,未来在搜索再查找效率非常低。我们想做的事情是把它们按照 ID 升序排好之后,假如比较平均四块,这拿着它们再给 HDFS 去存储就会发现那这两块这两个在一块里,这两个在一块里,这在一块里,这在一块,我们分四块。那看结构比刚才这边我们看到的右边结构显然效率要高一些。

image.png

我们要把表划分 buckets 的原因,它让查询变得效率更高,

这是我们看到的,而且它使表本身它的采样也会变得更高。数据会按照这样的方式去组织存储,比原始文件拿来靠 HDFS 来帮做分布的存储,效率要高。因此这就是它划分 buckets 的原因。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
SQL 存储 分布式数据库
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
268 0
|
7月前
|
SQL 关系型数据库 MySQL
Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
294 7
|
7月前
|
SQL JSON 算法
hive学习笔记
hive学习笔记
|
7月前
|
SQL 分布式计算 Hadoop
Hadoop学习笔记(HDP)-Part.16 安装HBase
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
142 1
Hadoop学习笔记(HDP)-Part.16 安装HBase
|
7月前
|
SQL 分布式计算 Hadoop
Hadoop学习笔记(HDP)-Part.15 安装HIVE
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
216 1
Hadoop学习笔记(HDP)-Part.15 安装HIVE
|
7月前
|
SQL 分布式数据库 HIVE
Hbase 和Hive表关联
Hbase 和Hive表关联
75 0
|
7月前
|
存储 SQL 分布式计算
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
547 0
|
7月前
|
SQL 分布式数据库 HIVE
Hbase二级索引_Hive on Hbase 及phoenix详解
Hbase二级索引_Hive on Hbase 及phoenix详解
84 0
|
7月前
|
SQL 分布式计算 分布式数据库
HBase 和 Hive 你能分清楚吗?(转拉勾教育)
HBase 和 Hive 你能分清楚吗?(转拉勾教育)
85 0
|
存储 SQL 分布式数据库
分布式数据恢复-hbase+hive分布式存储数据恢复案例
hbase+hive分布式存储数据恢复环境: 16台某品牌R730XD服务器节点,每台物理服务器节点上有数台虚拟机,虚拟机上配置的分布式,上层部署hbase数据库+hive数据仓库。 hbase+hive分布式存储故障&初检: 数据库文件被误删除,数据库无法使用。 通过现场对该分布式环境的初步检测,发现虚拟机还可以正常启动,虚拟机里面的数据库块文件丢失。好在块文件丢失之后没有对集群环境写入数据,底层数据损坏可能性比较小。