数据仓库——了解Hive必需的预备知识
先来了解下数仓的概念。数据仓库是一个用于存储、分析、报告的数据系统。其目的是构建面向分析的集成化数据环境。
数仓有两个特点:
- 数仓不“生产”数据,只是数据的存储仓库。其数据来源于不同外部系统。比如说HDFS,MySQL, SQLServer, Oracle等等。
- 数仓不“消费”数据,只是提供数据给各个外部应用使用。
既然已经有数据库存储数据了,为什么还要数仓?
我们可以简单地理解这个问题。假设当前一个文件夹中,包含了一个文档集合、一个图片集合、一个音频集合。我们当然可以分别通过文档编辑器、图片编辑器、音频编辑器打开它们,但是每打开一个都要换应用很麻烦。而且,想要完成整体的数据分析也很不方便,比如文档中记录了游玩的心情,图片中记录了游玩的景色与地点,想要结合文档与图片来“分析”发生了什么,一个应用是解决不了的。数据仓库就是将这些文档、图片、音频(多个不同来源的数据)集成在一起,因此可以提供一个全局的、统一的视图进行分析。
这里不得不提到一点,关系型数据库也可以进行数据分析,但是它们的设计主要是为了支持高效的事务处理(OLTP),而不是大规模的复杂分析(OLAP)。在处理大型数据集和复杂查询时,关系型数据库的性能可能会显著下降,因为其通常优化的是事务处理性能,而不是分析查询性能。
当然上面说的理由还不够全面,比如说数据仓库可以针对长时间、复杂的分析查询进行优化,支持多维分析和复杂的报告生成等等。因为不是本篇博客的重点,所以不再更多赘述。
Hive概述——What is it?
首先考虑一个问题:当大量数据都存放在HDFS上,如何快速对HDFS上的文件进行统计分析操作?
肯定能想到的是,通过MapReduce直接对HDFS文件进行操作。但是要完成这个工作,就必须先学Java,再学MapReduce才可以。这对不会Java的数据分析员来说非常不友好。
相比于Java的语法,SQL语法简单很多,并且大多数玩数据的多多少少都必须得会点儿数据库的知识,因此使用SQL来对HDFS上的文件进行统计分析操作就成了大势所趋的事情。
(*SQL,Structured Query Language结构化查询语言,专门用于管理和操作关系型数据库的数据操作语言。)
不幸的是,HDFS没有模式的概念,其存储的数据只是一个纯文本文件,也就说,缺少关系型数据库必需的数据组织方式。(模式,Schema,关系型数据库事先定义好的结构与数据类型,相当于表定义的字段、字段名称等)
HDFS数据缺少模式*,就没办法使用SQL进行查询。在这个背景下,Hive诞生了。
Hive是建立在Hadoop之上的开源数据仓库系统。可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,并且基于表提供了一种类似SQL的查询模型,称为Hive查询语言HQL,用于访问和分析存储在Hadoop文件中的大型数据集。
用户写的HQL被Hive转换为MapReduce程序,然后提交到Hadoop集群执行。同时对于熟悉MapReduce的使用者而言,也可以自定义Mapper和Reducer来处理内嵌Mapper和Reducer无法完成的复杂分析任务。
Hive利用HDFS存储数据,利用MapReduce查询分析数据
元数据
Hive的一个职责就是将HDFS中的纯文本数据转化为一张表,因此其需要完成文件与表之间的对应关系记录。这种关系记录,也就是一个映射信息,被称之为元数据信息。元数据,metadata,用来描述数据的数据。举个例子来说,一个表当中有多个字段,而文件当中的信息是按列来分的,我们定义好表的字段信息之后,还要记录下来文件的哪一列对应的是该字段。这个记录下来的对应关系,就是所说的元数据。
具体来看,要记录的元数据信息包括:
- 表对应着那个文件(位置信息)
- 表的列对应着文件哪一个字段(顺序信息)
- 文件字段之间的分隔符是什么
Hive特点
- 数据存储位置在HDFS/HBase
- 数据格式是用户定义的——低约束性
- 执行延迟较高——对于最小粒度的任务,Hive查询的反应时间约为毫秒级
- 可扩展性较高
- 数据规模往往很大(TB以上)
- 数据检查是读时模式
Hive体系结构
- 用户接口
主要有命令行Command-line interface(CLI), WebUI界面,通过JDBC/ODBC访问的Thrift。主要功能就是提供不同的方式让用户使用Hive。 - 元数据存储
Hive内置Derby数据库,可以用来存储元数据,但是当Hive重启之后所有的元数据都会丢失。也可以使用其他的自定义数据库,需要修改相应的配置项。 - Driver驱动程序
包括语法解析器、计划编辑器、优化器、执行器。将HiveQL语言编译成中间表示。 - 执行引擎
默认情况下,使用MapReduce执行引擎。但是MR执行速度慢,因此还支持Tez、Spark3执行引擎。执行引擎完成具体的执行操作,包括MapReduce执行、HDFS操作、元数据操作等。 - 资源管理Yarn
- 数据存储Hadoop HDFS或HBase
Hive工作原理
Hive安装与配置
三种安装模式:内嵌模式,本地模式,远程模式。搞清楚这三种模式的区别,只需要两个问题。
- 元数据服务是否需要单独配置、单独启动?
- 元数据是存储在Derby中的还是第三方数据库中的?
如果元数据需要单独启动,那么这是远程模式;如果元数据存储在Derby当中,那么这是内嵌模式。
内嵌模式只适用于简单的测试,一个内嵌的Derby数据库每次只允许一个会话连接,不支持多会话连接。本地模式能够支持多会会话和多用户连接。远程模式可以控制数据库的连接等。
远程模式的配置需要修改的文件
- hive-env.sh:配置上hadoop的位置目录
- hive-site.xml:配置元数据存储信息,配置Mysql的位置以及相关的mysql用户名密码信息。