Hive是基于Hadoop的一个外围数据仓库分析组件,可以把Hive理解为一个数据仓库,但这和传统的数据库是有差别的。
传统数据库是面向业务存储,比如 OA、ERP 等系统使用的数据库,而数据仓库是为分析数据而设计的。同时,数据仓库是在数据量巨大的情况下,为了进一步挖掘数据资源、为了企业决策需要而产生的,它不是所谓的 “大型数据库”。
Hive 通过将结构化的数据文件映射到一张数据库表上,然后通过执行 SQL 语句实现查询功能。它将 SQL 语句转换为 Hadoop 上的 MapReduce 任务提交运行,这种类 SQL 语言也称为 HQL,通过这种方法,就可以使不熟悉 MapReduce 程序的用户可以很方便地利用 SQL 语句实现大数据的查询、分析和汇总。
因此,可以将 Hive 理解为将 HQL 语句转换为 MR 的语言翻译器。它的数据分析是基于 MapReduce 的,而数据存储使用的是 HDFS。Hive 适合对离线数据(批数据)分析处理。
由图可知,Hive 主要由 Metastore、DB 和 Hiveserver2、Hive CLI 几部分组成。其中,Metastore 是 Hive 的核心,所有外围客户端比如 Beeline、Hue、Impala 最终都会连接到 Metastore,而 Metastore 再去访问 DB。
要访问 Hive,可以通过 Hive CLI(Command Line Interface)方式、程序连接方式 (JDBC/ODBC)、Web UI 方式进行。例如,你登录 Hadoop 外围机后,可以通过执行 hive 命令(hive CLI)去访问 Hive;如果你开发了一个程序,想让程序自动连接 Hive 实现查询分析,那么你就需要通过 Hiveserver2 方式连接到 Hive 上来;而如果你要给客户提供一个傻瓜式的查询平台,那么你就应该选择 Hue 这个 Web 查询工具。
由此可知,不同的应用需求,对 Hive 的访问方式也各不相同。下面我就来分别介绍下 Hive 中各个组件的功能及应用场景。
为了便于理解,我们将 Hive CLI、Beeline CLI、Hue、Impala 统称为 Hive 客户端。
MetaStore表示元数据存储,所谓的元数据就是Hive创建的数据库,表等信息,这些元数据可以存储在关系型数据库 Derby、MySQL 中。
可以把 MetaStore 理解为后端数据库的代理层,Hive 客户端连接到 MetaStore 后,MetaStore 再去连接后端 MySQL 数据库来存取元数据。这样,就可以有多个 Hive 客户端同时连接到 MetaStore,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,它们只需要连接 MetaStore 服务即可。
MetaStore 服务实际上就是一种 Thrift 服务,通过它我们可以获取到 Hive 元数据,并且通过 Thrift 获取元数据的方式,屏蔽了数据库访问需要的驱动、URL、用户名、密码等细节。由此可知,通过 MetaStore 服务,实现了对访问数据库的统一认证和验权。
顾名思义,这是 Hive 上启动的一个服务,在早期的 Hive 版本中,启动的服务是 HiveServer。此服务启动后,Hive 客户端就可以通过 IP 加端口的方式对 Hive 进行访问,此服务主要用于远程客户端使用各种编程语言向 Hive 提交请求并查询结果的情况。远程客户端可以通过 jdbc、odbc 等开发接口访问 HiveServer 服务。
由此可知,HiveServer 是一种可选服务,当有程序需要连接 Hive 的时候,才需要它,这也是生产环境使用最多的一种方式。但 HiveServer 无法处理来自多个客户端的并发请求,因此,从 Hive 0.11.0 版本开始,HiveServer2 替代了 HiveServer。
HiveServer2 是 HiveServer1 的改进版,目前 1 已经被废弃,2 可以支持多客户端并发和身份认证。同时可以为开放的 API 客户端(如 JDBC 和 ODBC)提供更好的支持。
HiveServer2 服务是 Hive 推荐的使用模式,因为它更加安全并且不需要直接对用户使用的 HDFS、Metastore 进行赋权。
Hive CLI 表示命令行接口,也就是以命令行的形式输入 SQL 语句进行数据查询操作。例如,你直接登录到 Hive 所在的服务器,然后在命令行中执行 hive 命令,如下图所示:
这种使用模式是 Hive CLI,这种客户端模式是最古老的一种 Hive 访问模式,它将 SQL 在本地编译,然后直接访问 MetaStore,属于重客户端模式。
目前,Hive CLI 已经被废弃,推荐使用 Beeline 模式。
Beeline 是一个新的 Hive CLI,它是一种基于 SQL 命令行的 JDBC 客户端,相比于 Hive CLI,它在安全性、稳定性、认证机制及界面使用上都有了很大提升。需要注意,使用 Beeline,需要依赖 Hiveserver2 服务,也就是 Hiveserver2 服务启动后,才能使用 Beeline 客户端。这从 Beeline 的运行流程上可以看出,Beeline 启动后,它首先会连接到 Hiveserver2 服务端口,接着再去请求 Metastore,而 Metastore 最后再去请求数据库,获取需要的元数据信息。
从 Hive 0.14 版本开始,Beeline 在通过 HiveServer2 工作时,会从 Hiveserver2 获取输出日志信息到标准错误输出(STDERR)。因此,我们在 beeline 命令行执行任务时,如果发生错误,会在屏幕输出错误信息。
Beeline 模式是将 SQL 提交到 Hiveserver2,然后由 Hiveserver2 负责编译,接着再去访问 Metastore,最后将分析任务提交到 Hadoop 上,相对于 Hive CLI,Beeline 是轻客户端模式。
Hive 是目前企业使用最多的数据仓库工具,典型应用场景有日志数据分析、构建数据仓库及数据挖掘等。例如,要统计 App 应用一段时间的 PV、UV 数据,并将数据通过不同维度进行展示;又比如要统计一个气象数据,要求统计出来 2019 年全年排行前 10 的最高气温日期及具体的温度。这些都是 Hive 的专长,从这些应用场景中可以看出,这些需求都对时间没有特别要求,一般是按天、周、月、年来进行数据统计。这其实就是离线分析场景。
此外,通过 Hive 还可以构建统一标准的数据仓库,从而提供基础数据,供上层应用进行更细化的数据分析。
Metastore 作为访问元数据库的代理层,它有三种运行模式,即内嵌模式(Embedded)、本地模式(Local)及远程模式(Remote Server),每种模式对应不同的使用场景。
内嵌模式使用的是 Hive 内嵌的 Derby 数据库来存储元数据,它不需要额外启动 Metastore 服务。数据库和 Metastore 服务都嵌入在启动的 Hive 进程中。这个是默认的模式,配置简单,但一个 Hive 进程一次只能连接一个客户端。使用此模式,只需要下载 Hive 安装包,解压后在命令行中执行 hive 命令,启动即可使用。
如果另一个客户端也要使用 Hive 的话,只需解压安装包启动 hive 命令即可。由此可以看出,不同客户端、不同路径启动的 hive,每个 hive 进程都拥有自己的一套元数据,这些元数据无法共享。
内嵌模式只适用于实验环境,不适用于生产环境。
本地模式不再使用内嵌的 Derby 作为元数据的存储介质,而是采用外部数据库来存储元数据。目前支持的外部数据库有 MySQL、PostgreSQL、Oracle 等,企业使用 MySQL 的比较多。
本地模式也不需要启动 Metastore 服务,当启动 Hive 服务后,Hive 进程里面会默认启动一个 Metastore 服务。如果我们采用的外部存储是 MySQL,那么 MySQL 可以和 Metastore 在一台机器上,也可以不在一台机器上。
Hive 在启动的时候会根据配置文件(hive-site.xml)中的 hive.metastore.uris 参数值来判断运行模式,如果没有配置此参数或者此参数为空,那么 Hive 将启动一个本地模式。
本地模式是一个多用户模式,多个客户端可以连接到同一个 MySQL 中,但每个客户端必须要有对 MySQL 的访问权限,也就是说每个连接到 Hive 的客户端都必须在 MySQL 库中进行授权。很显然,这种机制有很大问题,如果有几百个客户端需要连接到 Hive 的话,那么就要在 MySQL 中做几百个授权。此时,权限管理和数据安全都将面临极大考验。
这种模式可以作为公司内部测试、开发环境使用,不适用于生产环境。
远程模式仍然是采用外部数据库来存储元数据,同时需要单独启动 Metastore 服务,并且 Metastore 服务和 Hive 服务是两个独立不同的进程。由于启动了 Metastore 服务,Hive 客户端只需要在 hive-site.xml 中配置 hive.metastore.uris 参数来指定 Metastore 服务所在机器的 IP 和端口,即可快速连接到后端的元数据库中,无需对客户端在数据库中进行授权操作。
在生产环境中,建议使用远程模式,它更加高效和安全。
Hive Metastore 的三种配置模式,其实也就是 Hive 的三种运行方式,你可以根据使用场景来决定使用哪种模式。