Apache Hive 分布式SQL计算平台

一、Apache Hive 概述

1.1.什么是分布式SQL计算

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

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

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

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

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

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

1.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常用于数据仓库和数据分析场景,如日志分析、业务报表生成、数据挖掘等。

1.3.为什么使用Hive?

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

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

使用 Hive 处理数据的好处

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

二、模拟Hive 功能

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

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

如何实现呢上面的需求?

2.1.元数据管理

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

假设要执行: 

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

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

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

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

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

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

进行记录

2.2.解析器

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

SQL 解析器,需要能做到:

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

2.3.基础架构

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

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

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

2.4.Hive架构

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

三、Hive 基础架构

3.1.Hive架构图

3.2.Hive组件

3.2.1.Driver驱动程序

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

3.2.2.元数据存储

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

3.2.3.用户接口

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

四、Hive 部署

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

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

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

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

4.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`/

4.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

4.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/

4.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

4.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>
</configuration>

4.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 张元数据管理的表。

4.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 客户端

6.1.HiveServer2 服务

6.1.1.HiveServer2 服务说明

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

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

后台执行脚本: 

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

说明

bin/hive --service metastore ,启动的是元数据管理服务
bin/hive --service hiveserver2 ,启动的是 HiveServer2 服务

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

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

6.1.2.Hive 的客户端体系如下

6.1.3.启动服务

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 &

6.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账户

如下图:

6.3.DataGrip 使用

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

6.3.1.创建文件夹

在Windows下创建工程文件夹

6.3.2.DataGrip创建项目

6.3.3.连接Hive

6.3.4.配置Hive JDBC连接驱动

点击配置驱动

下载驱动

6.3.5.配置Hive 连接信息

连接后执行SQL如下:

6.4.DBeaver

跟上面类似,创建连接

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

即可编写SQL

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