Apache Hive 分布式SQL计算平台

一、数据仓库概述

1.1.什么是数据仓库(数仓)

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持目的而创建。

MySQL数据库 => 面向事务的集成化数据环境;但是DW则是面向分析的集成化数据环境,主要实现数据的写入与数据分析,很少有数据的修改操作!

数据仓库本身并不“生产”任何数据,同时自身也不需要消费任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。

1.2.数据仓库的主要特征

数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策 。

☆ 面向主题(确认要分析什么,什么就是主题)

主题是一个抽象的概念,是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。

☆ 集成性

通过对分散、独立、异构的数据库数据进行抽取、清理、转换和汇总便得到了数据仓库的数据

数据仓库中的综合数据不能从原有的数据库系统直接得到。因此在数据进入数据仓库之前,必然要经过统一与综合,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:

(1)要统一源数据中所有矛盾之处,如字段的同名异义、异名同义、单位不统一、字长不一致,等等。

(2)进行数据综合和计算。数据仓库中的数据综合工作可以在从原有数据库抽取数据时生成,但许多是在数据仓库内部生成的,即进入数据仓库以后进行综合生成的。

下图说明一个保险公司综合数据的简单处理过程,其中数据仓库中与“保险”主题有关的数据来自于多个不同的操作型系统。这些系统内部数据的命名可能不同,数据格式也可能不同。把不同来源的数据存储到数据仓库之前,需要去除这些不一致。

☆ 非易失性(不可更新性)

操作型数据库主要服务于日常的业务操作,使得数据库需要不断地对数据实时更新,以便迅速获得当前最新数据,不至于影响正常的业务运作。在数据仓库中只保存过去的业务数据,不需要每一笔业务都实时更新数据仓库,而是根据商业需要每隔一段时间把一批较新的数据导入数据仓库。

数据仓库的数据反映的是一段相当长的时间内历史数据的内容(离线数据)

数据非易失性主要是针对应用而言。数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留。数据仓库中一般有大量的查询操作,但修改和删除操作很少。因此,数据经加工和集成进入数据仓库后是极少更新的,通常只需要定期的加载和更新。

数仓:① 离线 => Hive ② 实时 => Flink

☆ 时变性

离线数仓:侧重于离线两个字,历史数据分析

实时数仓:侧重于实时两个字,实时数据分析

数据仓库包含各种粒度的历史数据。数据仓库中的数据可能与某个特定日期、星期、月份、季度或者年份有关。数据仓库的目的是通过分析企业过去一段时间业务的经营状况,挖掘其中隐藏的模式。

虽然数据仓库的用户不能修改数据,但并不是说数据仓库的数据是永远不变的。分析的结果只能反映过去的情况,当业务变化后,挖掘出的模式会失去时效性。因此数据仓库的数据需要更新,以适应决策的需要。从这个角度讲,数据仓库建设是一个项目,更是一个过程 。数据仓库的数据随时间的变化表现在以下几个方面:

① 数据仓库的数据时限一般要远远长于操作型数据的数据时限。

② 操作型系统存储的是当前数据,而数据仓库中的数据是历史数据。

③ 数据仓库中的数据是按照时间顺序追加的,它们都带有时间属性。

面向主题分析,经常要与时间相关,所以SQL语句经常需要对时间进行分析查询

1.3.数据仓库与数据库区别

很多人在学习数仓时,都会认为这是不是就是大号的数据库呢?答:这是错误的理解,两者是完全不同的

数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别。

  • 数仓:OLAP("A",分析)=> 分析(查)
  • 数据库:OLTP("T",事务) => 事务(增删改)

操作型处理,叫联机事务处理OLTP(On-Line Transaction Processing,),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。

分析型处理,叫联机分析处理OLAP(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持管理决策。

首先要明白,数据仓库的出现,并不是要取代数据库:

  • 数据库是面向事务的设计,数据仓库是面向主题设计的。
  • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
  • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
  • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”==。

对比:数据库(OLTP)与数据仓库(OLAP)区别

答:明确一点,数据仓库的出现不是用于代替数据库的,是两种完全不同的应用。

① 数据库是事务型OLTP处理,支持增删改查操作;数据仓库是面向主题OLAP型应用,主要是查询操作,很少有更新与删除

② 数据量不同,数据库数据量较少;数据仓库往往是海量数据(底层是HDFS)

③ 存储数据时效性不同,数据库往往是当前数据,数仓往往历史数据(离线)

④ 查询速度也有很大区别,数据库往往是低延迟,数据仓库往往是高延迟查询

1.4.数据仓库分层架构(重点)

按照数据流入流出的过程,数据仓库架构可分为三层:源数据数据仓库数据应用。

数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。 

数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

ODS:源数据层,主要负责原始数据的存储

DW:数据仓库层,主要负责对ODS层的数据进行清洗、转换、分析

DA/APP/RPT:数据应用层,主要负责对主题分析的结果进行最终的展现

强调:所谓的分层就是把海量数据分不同的数据库进行存放。ods数据库、dw数据库、rpt数据库

为什么要对数据仓库分层?

用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

面试题:你们项目是如何进行分层的,为什么要进行数仓分层?
第一个问题:
我们的项目一般分为三层:① ODS源数据层(采集源数据)② DW数据仓库层(数据清洗与数据分析)③ DA数据应用层(把分析结果对应外部应用)
​
第二个问题:
① 清晰的数据结构
② 实现血缘追踪(数据治理中的一个概念)
③ 减少重复开发
④ 把复杂问题简单化:大问题拆解若干个小问题 => 美团点评 153张数据表 => 12张数据表
⑤ 屏蔽原始数据异常

1.5.ETL与ELT

数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(==抽取Extract, 转化Transform , 装载Load==)的过程。

但是在实际操作中将数据加载到仓库却产生了两种不同做法:ETL和ELT。

☆ ETL

我们来回顾一下ETL的流程:

① 首先从源端拉取数据,这个过程就是extract。通常我们所熟知的Kettle,Sqoop这些数据同步工具就是干这个事情的。

② 当从源端拉取数据后,并没有直接灌入到目标表,大家可以理解成是先放到一个缓冲区,在这个区域内进行一些符合目标系统标准的预处理,比如我们建设数仓的时候对于数据同步后会把一些空值置转换为一些默认值,以此来保障数据完整性,对于不同源端的同一种含义的字段信息会进行统一格式转换,对于敏感数据会进行加密等等这些操作,一般是在入仓之前处理掉的。大家也可以当作是在ODS层。

③ 当预处理完之后,将数据写入到目标系统中,那么这个时候也就是真正的入仓,也就是说仓中的数据都是要符合数仓标准的。

那么这种流程有什么好处呢?

① 首先入仓之后的数据肯定是已经标准化的了,那么对于下游的使用方是不是很方便了呢?比如说分析师想要统计一些指标,直接使用数仓的表是不是可以省略掉复杂的数据规范处理。

② 对于一些敏感数据,如果在入仓之前就进行加密处理,这种模式更加符合日常处理流程。

③ 目前市面上有很多集成的ETL工具,可以很容易实施并完成这一整套的流程,而不需要过于复杂的操作。

任何事物都有正反两面,既然ETL有以上的好处,那么肯定是有一些缺点的。这里以敏感数据加密场景为例:比如敏感数据在入仓之前,要对敏感数据进行一些定制的加密算法处理,而这种算法需要调用三方接口或者外部接口才能够完成,那么大家思考一下,如果敏感数据量达到上千万,那么ETL整个流程所需的耗时是不是肯定会很长?

☆ ELT

使用ELT,数据在从数据源中提取后立即加载。没有专门的临时数据库(没有缓冲区),这意味着数据会立即加载到单一的集中存储库中。数据在数据仓库系统中进行转换,以便与商业智能工具(BI工具)一起使用。大数据时代数仓这个特点很明显。

如上图所示,我们来介绍下ELT的流程:

① 和ETL中的E作用一样,即从源端系统抽取数据,比如Mysql,Oracle等等。

② 该步骤的流程就和ETL不一样了,T和L进行了位置置换,这里是先加载到目标系统,大家也可以理解成是数据入了仓。

③ 当数据入了仓之后,再进行T操作,也就是进行转换。也就是说数据转换标准化操作由缓冲区转移到了仓中进行。

那么T和L进行置换之后,有什么好处呢?

① 首先针对于ETL模式下介绍的敏感数据加密的例子就得到了很好的效率提升,借助于我们目前所使用的大数据技术,比如定义UDF之类的在仓中进行加密处理,那么速度肯定会比在ETL模型下要快。这也就是说ELT其实是适用于大数据量集的。

② 站在消费方来说,当要使用数据的时候,无需等待转换标准化处理完成入仓之后才能使用,而是可以直接在仓中访问原始数据,但是这样一来会加重分析师对数据清洗的操作。

③ 目前大多数公司都有现成的平台来建设数仓,而且随着云上数仓的模式逐渐成熟,ELT受益于这种平台生态系统,这样一来转换过程通常是自动化或者说是配置化的,所以在维护方面带来了便利。

二、Apache Hive (离线数仓)

2.1.什么是分布式SQL计算

对数据进行统计分析, SQL 是目前最为方便的编程工具。大数据体系中充斥着非常多的统计分析场景,所以使用 SQL 去处理数据,在大数据中也是有极大的需求的。

MapReduce 支持程序开发( Java 、 Python等)但不支持 SQL 开发

分布式SQL计算是指使用分布式计算框架来执行SQL查询和分析操作。传统的关系型数据库系统通常是单点的,难以处理大规模数据和高并发查询。而分布式SQL计算则利用分布式计算框架(如Hadoop、Spark、Presto等)来实现对大规模数据集的并行处理和分析。

在分布式SQL计算中,数据通常存储在分布式文件系统或分布式数据库中,通过SQL语句进行查询和分析。这些SQL查询会被分解成多个子任务,并在集群中的多台计算节点上并行执行,以加快查询速度和提高处理能力。分布式SQL计算框架通常会自动处理任务的分发、数据的分片和结果的合并,使得用户可以像在单机数据库中一样方便地进行复杂的数据分析和查询操作。

分布式SQL计算的优势包括:

  1. 横向扩展性:可以通过增加计算节点来扩展系统的处理能力,适应不断增长的数据量和查询负载。
  2. 高性能:利用并行计算和数据分片技术,可以加速大规模数据的查询和分析过程。
  3. 容错性:分布式SQL计算框架通常具有容错机制,能够处理节点故障和数据丢失,保障系统的稳定性和可靠性。

2.2.Apache Hive是什么?

Apache Hive 是一款分布式 SQL 计算的工具, 其主要功能是:将 SQL 语句 翻译成 MapReduce 程序运行

说明:基于 Hive 为用户提供了分布式 SQL 计算的能力,写的是 SQL 、但是执行的还是 MapReduce任务

Apache Hive是一个基于Hadoop的数据仓库基础架构,用于大规模数据存储和查询。它提供了一种类似SQL的查询语言,称为HiveQL,使用户可以轻松地对存储在Hadoop分布式文件系统 (HDFS) 中的海量数据进行查询和分析。以下是关于Apache Hive的一些关键点:

  1. 数据仓库基础架构:Hive主要用于数据仓库应用场景,适合大规模数据的存储、查询和管理。
  2. HiveQL:Hive提供了一种类似SQL的查询语言HiveQL,用户可以使用HiveQL编写查询语句,而无需了解底层MapReduce的复杂性。HiveQL支持大多数SQL标准的功能,如SELECT、JOIN、GROUP BY、ORDER BY等。
  3. 数据存储:Hive将数据存储在HDFS中,支持多种数据格式,包括文本文件、序列文件、ORC(Optimized Row Columnar)、Parquet等。
  4. 数据处理:Hive通过将HiveQL查询转换为MapReduce任务来处理数据。除了MapReduce,Hive还可以集成其他计算框架,如Apache Tez和Apache Spark,以提高查询性能和效率。
  5. 模式管理:Hive支持对数据模式(Schema)的管理,允许用户定义表、分区和列。表可以是内部表(存储在HDFS中,由Hive管理)或外部表(存储在HDFS之外,由用户管理)。
  6. 扩展性和容错性:作为基于Hadoop的系统,Hive具有良好的扩展性和容错性,可以处理PB级的数据集,并且能够在节点故障时自动恢复。
  7. 典型应用:Hive常用于数据仓库和数据分析场景,如日志分析、业务报表生成、数据挖掘等。

2.3.为什么使用Hive?

使用Hadoop MapReduce直接处理数据所面临的问题有:

  • 学习成本太高需要掌握 java 、Python 等编程语言
  • MapReduce 实现复杂查询逻辑开发难度太大

使用 Hive 处理数据的好处

  • 操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)
  • 底层执行 MapReduce, 可以完成分布式海量数据的 SQL 处理

三、模拟Hive 功能

如果我们自己设计 Hive 类似软件,要求能够实现

  • 用户编写 SQL 语句
  • Hive 自动将 SQL 转换 MapReduce 程序并提交运行
  • 处理位于 HDFS 上的结构化数据。

如何实现呢上面的需求?

3.1.元数据管理

假设有如下结构化文本数据存储在 HDFS 中。

假设要执行: 

SELECT city, COUNT(*) FROM t_user GROUP BY city;

针对这个SQL翻译成 MapReduce 程序,会出现哪些困难?

  • 数据文件存在哪里?
  • 使用什么符号作为列的分隔符?
  • 哪些列可以作为 city 使用?
  • city 列是什么类型的数据?

 这些信息同时也需要有地方存储起来,方便多次使用。如何存储最好呢?很简单,找一个数据库即可,比如 MySQL

所以,我们可以总结出来第一个点, 即构建分布式 SQL 计算, 需要拥有元数据管理功能,即:

  • 数据位置
  • 数据结构
  • 等对数据进行描述

进行记录

3.2.解析器

解决了元数据管理后,还有一个至关重要的步骤, 即完成 SQL 到 MapReduce 转换的功能也就是SQL解析器。

SQL 解析器,需要能做到:

  • 进行SQL 分析
  • 将SQL 提交到 MapReduce 程序的转换
  • 提交 MapReduce 程序运行并收集执行结果

3.3.基础架构

当解析器也拥有了之后,我们就完成了一款基于 MapReduce 的,分布式 SQL 执行引擎的基础构建。即,核心组件需要有:

  • 元数据管理,帮助记录各类元数据
  • SQL 解析器,完成 SQL 到 MapReduce 程序的转换

当拥有这 2 个组件, 基本上分布式 SQL 计算的能力就实现了

3.4.Hive架构

同上面,Apache Hive 其 2 大主要组件就是: SQL 解析器以及元数据存储, 如下图。

四、Hive 基础架构

4.1.Hive架构图

4.2.Hive组件

4.2.1.Driver驱动程序

Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器,完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。这部分内容不是具体的服务进程,而是封装在 Hive 所依赖的 Jar 文件即 Java 代码中。

4.2.2.元数据存储

通常是存储在关系数据库如 mysql、derby 中。 Hive 中的元数据包括表的名字、表的列和分区及其属性、表的属性(是否为外部表等)、表的数据所在目录等。-- Hive 提供了 Metastore 服务进程提供元数据管理功能

4.2.3.用户接口

包括 CLI 、JDBC/ODBC 、WebGUI 。其中, CLI(command line interface) 为 shell 命令行; Hive 中的 Thrift服务器允许外部客户端通过网络与 Hive 进行交互,类似于 JDBC 或 ODBC 协议。 WebGUI 是通过浏览器访问Hive 。-- Hive 提供了 Hive Shell

五、Hive 部署

5.1.metadata(元数据) 、metastore (元数据服务)

Metadata即元数据。元数据包含用Hive创建的database、table、表的字段等元信息。元数据存储在关系型数据库中。如hive内置的Derby、第三方如MySQL等。

注意:元数据只有数据库、数据表结构,但是没有数据(实际数据放在HDFS中)

Metastore即元数据服务。作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

5.2.metastore三种配置方式

metastore服务配置有3种模式:内嵌模式、本地模式、远程模式。区分3种配置方式的关键是弄清楚两个问题:

Metastore服务是否需要单独配置、单独启动?

Metadata是存储在内置的derby中,还是第三方RDBMS,比如Mysql。

本系列课程中使用企业推荐模式:远程模式部署。

☆ 内嵌模式

内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。

数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。

解压hive安装包 bin/hive 启动即可使用

缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享。

☆ 本地模式

本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。

本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个metastore服务。

hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式

缺点是:每启动一次hive服务,都内置启动了一个metastore。

本地模式下hive的配置只需要指定mysql的相关信息即可。

☆ 远程模式(重点)

远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。

在生产环境中,建议用远程模式来配置Hive Metastore。

在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。

远程模式下,需要配置hive.metastore.uris参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务

5.3.远程模式部署

Hive 是单机工具,只需要部署在一台服务器即可。Hive 虽然是单机的,但是它可以提交分布式运行的MapReduce 程序运行。

知道 Hive 是单机工具后,需要准备一台服务器供 Hive 使用即可。同时 Hive 需要使用元数据服务,即需要提供一个关系型数据库,选择一台服务器安装关系型数据库即可。所以:

5.3.1.步骤 1 :安装 MySQL 数据库

安装MySQL参考:https://www.cnblogs.com/auguse/articles/13324110.html

5.3.2.步骤 2 :配置 Hadoop

Hive 的运行依赖于 Hadoop ( HDFS、MapReduce、 YARN 都依赖)同时涉及到 HDFS 文件系统的访问,所以需要配置 Hadoop 的代理用户,即设置 hadoop 用户允许代理(模拟)其它用户,配置如下内容在 Hadoop 的 core-site.xml 中,并分发到其它节点,且重启 HDFS 集群

配置如下内容在 Hadoop 的 core-site.xml 中,并分发到其它节点,且重启 HDFS 集群

<property>
    <name>hadoop.proxyuser.hadoop.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hadoop.groups</name>
    <value>*</value>
</property>

分发文件到node1、node2

scp core-site.xml node2:`pwd`/
scp core-site.xml node3:`pwd`/

5.3.3.步骤 3 :下载解压 Hive

切换到 hadoop 用户

su - hadoop

下载 Hive 安装包:

http://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz

解压到 node1 服务器的: /export/server/ 内

tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /export/server/

设置软连接

ln -s /export/server/apache-hive-3.1.3-bin /export/server/hive

5.3.4.步骤 4 :提供 MySQL Driver 包

下载 MySQL 驱动包:

https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar

将下载好的驱动 jar 包,放入: Hive 安装文件夹的 lib 目录内

mv /opt/mysql-connector-java-8.0.30.jar /export/server/hive/lib/

5.3.5.步骤 5 :配置 Hive

在 Hive 的 conf 目录内,新建 hive-env.sh 文件,填入以下环境变量内容:

export HADOOP_HOME=/export/server/hadoop
export HIVE_CONF_DIR=/export/server/hive/conf
export HIVE_AUX_JARS_PATH=/export/server/hive/lib

5.3.6.步骤 5 :配置 Hive

在 Hive 的 conf 目录内,新建 hive-site.xml 文件,填入以下内容:

<configuration>
    <!-- MySQL数据库连接URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    </property>
    <!-- MySQL数据库驱动程序 -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    <!-- MySQL数据库用户名 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <!-- MySQL数据库密码 -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    <!-- Hive Thrift服务绑定主机 -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>node1</value>
    </property>
    <!-- Hive元数据存储服务URI -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node1:9083</value>
    </property>
    <!-- 禁用Hive元数据事件通知的API认证 -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <!--hive.server2.enable.doAs 设置为 true 表示允许 Hive 使用代理用户执行操作。如果启动代理用户,这个必须配置-->
    <property>
        <name>hive.server2.enable.doAs</name>
        <value>true</value>
    </property>
</configuration>

如果客户端工具访问的时候报错

Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hadoop is not allowed to impersonate hadoop org.apache.hadoop.ipc.RemoteException:User: hadoop is not allowed to impersonate hadoop 

就需要添加配置

<property>
    <name>hive.server2.enable.doAs</name>
    <value>true</value>
</property>

hive.server2.enable.doAs 配置项控制了 HiveServer2 是否以用户身份执行查询操作。作用:

  • true:当配置为 true 时,HiveServer2 会以客户端用户(即发起查询请求的用户)的身份执行操作。这意味着 HiveServer2 会根据客户端用户的权限来访问 HDFS 和其他资源,从而实现多租户隔离和访问控制。

  • false:当配置为 false 时,HiveServer2 会以启动 HiveServer2 服务的用户身份(通常是 hive 用户)来执行所有操作,而不管发起查询的用户是谁。这种情况下,所有的查询操作都会以 HiveServer2 进程用户的权限执行。

5.3.6.步骤 6 :初始化元数据库

Hive 的配置已经完成,现在在启动 Hive 前,需要先初始化 Hive 所需的元数据库。

  • 在 MySQL 中新建数据库: hive
CREATE DATABASE hive CHARSET UTF8;

执行元数据库初始化命令:

cd /export/server/hive
bin/schematool -initSchema -dbType mysql -verbos

注意:初始化成功后,会在 MySQL 的 hive 库中新建 74 张元数据管理的表。

5.3.7.步骤 7 :启动 Hive (使用 Hadoop 用户)

确保 Hive 文件夹所属为 hadoop 用户

  • 创建一个 hive 的日志文件夹:
mkdir /export/server/hive/logs
  • 启动元数据管理服务(必须启动,否则无法工作,推荐后台启动)
前台启动: bin/hive --service metastore
后台启动: nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
  • 启动客户端,二选一(当前先选择 Hive Shell 方式)
Hive Shell 方式(可以直接写 SQL ): bin/hive
Hive ThriftServer 方式(不可直接写 SQL ,需要外部客户端链接使用): bin/hive --service hiveserver2

通过Hive Shell连接,

Hive ThriftServer 方式后面在说

六、Hive 初体验

首先,确保启动了 Metastore 服务。可以执行: bin/hive ,进入到 Hive Shell 环境中,可以直接执行 SQL 语句。

  • 创建表
CREATE TABLE test(id INT,name STRING,gender STRING);
  • 插入数据
INSERT INTO test VALUES(1,'李丽','男'), (2,'吴迪','男'), (3,'张倩','女');
  • 查询数据
SELECT gender, COUNT(*) AS cnt FROM test GROUP BY gender;
  • 验证 Hive 的数据存储
Hive 的数据存储在 HDFS 的: /user/hive/warehouse 中
  • 验证 SQL 语句启动的 MapReduce 程序
打开 YARN 的 WEB UI 页面查看任务情况: http://node1:8088

七、Hive 客户端

7.1.HiveServer2 服务

7.1.1.HiveServer2 服务说明

在启动 Hive 的时候,除了必备的 Metastore 服务外,我们前面提过有 2 种方式使用 Hive :

  • 方式 1 : bin/hive 即 Hive 的 Shell 客户端,可以直接写 SQL
  • 方式 2 : bin/hive --service hiveserver2

后台执行脚本启动HiveServer2: 

nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

HiveServer2 是 Hive 内置的一个 ThriftServer 服务,提供 Thrift 端口供其它客户端链接,可以连接 ThriftServer 的客户端有:

  • Hive 内置的 beeline 客户端工具(命令行工具)
  • 第三方的图形化 SQL 工具,如 DataGrip 、 DBeaver 等

7.1.2.Hive 的客户端体系如下

7.1.3.启动服务(上面如果已经启动可以不做)

注意:如果客户端后续连接报错,一定要重启服务(先关闭,在启动)

一键关闭 HDFS 集群,执行原理:
$HADOOP_HOME/sbin/stop-dfs.sh
一键启动 HDFS 集群,执行原理:
$HADOOP_HOME/sbin/start-dfs.sh

MapReduce和YARN的使用:

一键停止YARN集群: $HADOOP_HOME/sbin/stop-yarn.sh
一键启动YARN集群: $HADOOP_HOME/sbin/start-yarn.sh

在 hive 安装的服务器上,首先启动 metastore 服务,然后启动 hiveserver2 服务

# 先启动 metastore 服务 然后启动 hiveserver2 服务
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

7.2.beeline

node1 上使用 beeline 客户端进行访问。需要注意 hiveserver2 服务启后需要等一会可以对提供服务
Beeline JDBC 的客户端,通过 JDBC 协议和 Hiveserver2 服务进行信,协议的地是: jdbc:hive2://node1:10000

连接beeline客户端:

# 启动客户端
/
export/server/hive/bin/beeline
# 通过 JDBC 协议和 Hiveserver2 服务进行
!connect jdbc:hive2://node1:10000
# 输入用户名和密码,需要有操作HDFS的权限,我们使用hadoop账户

如下图:

7.3.DataGrip 使用

DataGrip 是 JetBrains 开发的一款强大的跨平台数据库和 SQL IDE。它适用于 macOS、Windows 和 Linux,专为 SQL 开发而设计。DataGrip 不仅可以连接到各种数据库,还能检测潜在的代码错误并提供修复建议。

7.3.1.创建文件夹

在Windows下创建工程文件夹

7.3.2.DataGrip创建项目

7.3.3.连接Hive

7.3.4.配置Hive JDBC连接驱动

点击配置驱动

下载驱动

7.3.5.配置Hive 连接信息

连接后执行SQL如下:

7.4.DBeaver

跟上面类似,创建连接

连接后即可,添加SQL编辑器

即可编写SQL

posted @ 2019-10-29 11:16  酒剑仙*  阅读(1444)  评论(0)    收藏  举报