探索数据湖中的巨兽:Apache Hive分布式SQL计算平台浅度剖析!

文章目录

  • [◆ Apache Hive 概述](#◆ Apache Hive 概述)
    • [1.1 分布式SQL计算](#1.1 分布式SQL计算)
    • [1.2 Hive的优势](#1.2 Hive的优势)
  • [◆ 模拟实现Hive功能](#◆ 模拟实现Hive功能)
    • [2.1 元数据管理](#2.1 元数据管理)
    • [2.2 解析器](#2.2 解析器)
    • [2.3 基础架构](#2.3 基础架构)
    • [2.4 Hive架构](#2.4 Hive架构)
  • [◆ Hive基础架构](#◆ Hive基础架构)
    • [3.1 Hive架构图](#3.1 Hive架构图)
    • [3.2 Hive组件](#3.2 Hive组件)
      • [3.2.1 元数据存储](#3.2.1 元数据存储)
      • [3.2.2 Driver驱动程序](#3.2.2 Driver驱动程序)
      • [3.2.3 用户接口](#3.2.3 用户接口)
  • [◆ Hive部署](#◆ Hive部署)
  • [◆ Hive初体验](#◆ Hive初体验)
    • [5.1 hiveShell初体验](#5.1 hiveShell初体验)
    • [5.2 补充:JPS命令](#5.2 补充:JPS命令)
  • [◆ Hive客户端](#◆ Hive客户端)
    • [6.1 HiveServer2服务](#6.1 HiveServer2服务)
    • [6.2 HiveServer2服务 启动](#6.2 HiveServer2服务 启动)
    • [6.3 Beeline](#6.3 Beeline)
    • [6.4 DataGrip链接Hive](#6.4 DataGrip链接Hive)

◆ Apache Hive 概述

1.1 分布式SQL计算

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

  • MapReduce支持程序开发(Java、Python等),但不支持SQL开发
  • Apache Hive是一款分布式SQL计算的工具 , 其主要功能是:将SQL语句 翻译成MapReduce程序运行
  • 基于Hive为用户提供了分布式SQL计算的能力写的是SQL、执行的是MapReduce

1.2 Hive的优势

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

◆ 模拟实现Hive功能

2.1 元数据管理



  • 总结
  • 构建数据库首先需要拥有元数据管理功能,即:数据位置、数据结构、对数据进行描述 进行记录

2.2 解析器

  • 解决了元数据管理后,我们还有一个至关重要的步骤, 即完成SQL到MapReduce转换的功能。
  • SQL解析器需要完成的功能:
    • SQL分析
    • SQL到MapReduce程序的转换
    • 提交MapReduce程序运行并收集执行结果

2.3 基础架构

  • 至此,一款基于MapReduce的,分布式SQL执行引擎的基础构建完成。
  • 核心组件需要有:
    • 元数据管理,帮助记录各类元数据
    • SQL解析器,完成SQL到MapReduce程序的转换

2.4 Hive架构

  • Apache Hive其2大主要组件就是:SQL解析器以及元数据存储。

◆ Hive基础架构

3.1 Hive架构图

3.2 Hive组件

3.2.1 元数据存储

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

3.2.2 Driver驱动程序

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

3.2.3 用户接口

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

◆ Hive部署

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

4.1 VMware虚拟机部署

  • Hive是单机工具,需要准备一台服务器供Hive使用即可。同时Hive需要使用元数据服务,即需要提供一个关系型数据库,我们也选择一台服务器安装关系型数据库即可。

步骤一:安装MySQL数据库

  • 这里展示课件中的MYSQL5.7安装方式和使用MySQL8.+版本的操作,请按照喜欢选择

  • 在node1节点使用yum在线安装MySQL5.7版本
bash 复制代码
# 更新密钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 安装Mysql yum库
rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm

# yum安装Mysql
yum -y install mysql-community-server

# 启动Mysql设置开机启动
systemctl start mysqld
systemctl enable mysqld

# 检查Mysql服务状态
systemctl status mysqld

# 第一次启动mysql,会在日志文件中生成root用户的一个随机密码,使用下面命令查看该密码
grep 'temporary password' /var/log/mysqld.log
bash 复制代码
# 修改root用户密码
mysql -u root -p -h localhost
Enter password:
 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root!@#$';

# 如果你想设置简单密码,需要降低Mysql的密码安全级别
set global validate_password_policy=LOW; # 密码安全级别低
set global validate_password_length=4;	 # 密码长度最低4位即可

# 然后就可以用简单密码了(课程中使用简单密码,为了方便,生产中不要这样)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

/usr/bin/mysqladmin -u root password 'root'

grant all privileges on *.* to root@"%" identified by 'root' with grant option;  
flush privileges;

  • 在node1节点使用yum在线安装MySQL8.+版本
  1. 更新软件

    bash 复制代码
    sudo yum update
  2. 安装 MySQL 官方的 Yum Repository:

    bash 复制代码
    sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  3. 安装 MySQL 服务器:

    sql 复制代码
    sudo yum install mysql-server --nogpgcheck
  4. 启动 MySQL 服务:

    bash 复制代码
    sudo systemctl start mysqld
    • 设置MySQL 服务在系统启动时自动启动
    bash 复制代码
    sudo systemctl enable mysqld
  5. 获取初始密码并进行安全设置:

    • 当次安装 MySQL 8 之后,它会为 root 用户生成一个随机的临时密码。通过查看日志来获得这个密码:
    sql 复制代码
    sudo grep 'temporary password' /var/log/mysqld.log
  6. 登录到 MySQL,输入之前设置的 root 用户的密码:

    bash 复制代码
    mysql -u root -p
  7. 然后,设置root用户密码:

    bash 复制代码
    # 设置用户密码xxxxx
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxx';

  • 以下操作时给与root用户的远程登录权限
  1. 创建或修改用户

    • 如果root@"%"用户不存在:
    bash 复制代码
    CREATE USER 'root'@'%' IDENTIFIED BY 'xxx';
    • 如果root@"%"用户已存在,并且您只是想更新密码:
    bash 复制代码
      ALTER USER 'root'@'%' IDENTIFIED BY 'xxx';
  2. 赋予权限

    bash 复制代码
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  3. 刷新权限

    bash 复制代码
    FLUSH PRIVILEGES;
  4. 退出

    bash 复制代码
    exit

步骤2:配置Hadoop

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

步骤3:下载解压Hive

  1. 切换到hadoop用户

    bash 复制代码
    su - hadoop
  2. 下载Hive安装包,打开apache归档网址,点击公共软件版本档案 ,Ctrl+F查找hive打开目录,找到3.1.3版本进行下载


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

    bash 复制代码
    tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /export/server/
  2. 设置软连接

    bash 复制代码
    ln -s /export/server/apache-hive-3.1.3-bin/ /export/server/hive

步骤4:提供MySQL Driver包

  • 下载MySQL驱动包
  • ·将下载好的驱动jar包,放入: Hive安装文件夹的lib目录内
bash 复制代码
mv mysql-connector-java-8.0.30.jar /export/server/hive/lib/

步骤5:配置Hive

  • 在Hive的conf目录内,新建hive-env.sh文件,填入以下环境变量内容:
bash 复制代码
export HADOOP_HOME=/export/server/hadoop
export HIVE_CONF_DIR=/export/server/hive/conf
export HIVE_AUX_JARS_PATH=/export/server/hive/lib
  • 在Hive的conf目录内,新建hive-site.xml文件,填入以下内容【注意修改Mysql连接密码为自己的密码】
xml 复制代码
<configuration>
  <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>

  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>xxxx</value>
  </property>

  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>node1</value>
  </property>

  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://node1:9083</value>
  </property>

  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>
</configuration>

步骤6:初始化元数据库

  1. Hive的配置已经完成,现在在启动Hive前,需要先初始化Hive所需的元数据库
  2. 在MySQL中新建数据库:hive
sql 复制代码
CREATE DATABASE hive CHARSET UTF8;
  1. 执行元数据库初始化命令:
sql 复制代码
#进入hive的bin目录
cd /export/server/hive/bin/
#执行初始化命令
./schematool -initSchema -dbType mysql -verbos
  1. 初始化成功后,会在MySQL的hile库中新建74张元数据管理的表

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

  • 确保Hive文件夹所属为hadoop用户,创建一个hive的日志文件夹:

    sql 复制代码
    mkdir /export/server/hive/logs
  • 启动元数据管理服务(必须启动,否则无法工作)

    • 前台启动:bin/hive --service metastore
    • 后台启动【推荐】:nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
    • nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &含义:将元数据相关的日志存储到logs/文件夹下
  • 启动客户端,二选一(当前先选择Hive Shell方式)

    • Hive Shell方式(可以直接写SQL): /bin/hive
    • Hive ThriftServer方式(不可直接写SQL,需要外部客户端链接使用): bin/hive --service hiveserver2

◆ Hive初体验

5.1 hiveShell初体验

  • 首先,确保启动Metastore服务。

    bash 复制代码
    jps
    ps -ef|grep 端口号
  • 在hive目录下执行:bin/hive,进入到Hive Shell环境中,可以直接执行SQL语句

  • 创建表

    sql 复制代码
    CREATE TABLE test(id INT, name STRING, gender STRING);
  • 插入数据

    sql 复制代码
    INSERT INTO test VALUES(1,'王力红','男'),(2,'周杰轮','男'),(3, '林志灵','女');
  • 查询数据

    sql 复制代码
    SELECT gender, COUNT(*) AS cnt FROM test GROUP BY gender;
  • 验证Hive的数据存储

    • Hive的数据存储在HDFS的:/user/hive/warehouse

  • 验证SQL语句启动的MapReduce程序

    • 打开YARN的WEB UI页面查看任务情况:http://node1:8088

5.2 补充:JPS命令

  • 在Linux系统中,jps 命令并不是自带的命令,而是Java开发工具包(JDK)提供的工具。
  • 在Linux系统中安装了JDK,可以在JDK的安装路径下的bin目录中找到 jps 命令。通常,安装JDK后,你可以通过在终端中输入 jps 来执行该命令。但在某些Linux发行版中,jps 命令可能需要通过设置环境变量或使用完整的路径来执行。
  • jps 是 Java Virtual Machine Process Status Tool(Java虚拟机进程状态工具)的缩写。它是Java开发工具包中的一个命令行工具,用于列出当前系统中所有正在运行的Java进程的相关信息。jps 命令通常用于诊断和监控Java应用程序的运行状态。
  • 使用 jps 命令可以列出正在运行的Java进程的进程ID(PID)以及这些进程的主类名。它可以帮助开发人员确定系统中正在运行的Java进程及其状态,特别是在进行多进程调试或监控的情况下。
  • ps 命令常用的选项和用法:
  1. jps:列出并显示所有正在运行的Java进程的进程ID和主类名。
  2. jps -l 或 jps --list:显示进程ID、主类名以及传递给主类的参数。
  3. jps -v 或 jps --verbose:显示进程ID、主类名、传递给主类的参数以及JVM的启动参数。
  4. jps -m 或 jps --m:显示进程ID、主类名、传递给主类的参数以及传递给JVM的参数。
  5. jps -q 或 jps --quiet:只显示进程ID,不显示主类名。

◆ Hive客户端

6.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等

  • Hive的客户端体系

6.2 HiveServer2服务 启动

  • 在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务
bash 复制代码
#先启动metastore服务 然后启动hiveserver2服务
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

6.3 Beeline

  • 在node1上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务。

    bash 复制代码
    # 在hive目录下执行
    bin/beeline
  • Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,协议的地址是:jdbc:hive2://node1:10000

6.4 DataGrip链接Hive

  • DataGrip、Dbeaver、SQuirrel SQL Client等可以在Windows、MAC平台中通过JDBC连接HiveServer2的图形界面工具;
  • 这类工具往往专门针对SQL类软件进行开发优化、页面美观大方,操作简洁,更重要的是SQL编辑环境优雅;
  • SQL语法智能提示补全、关键字高亮、查询结果智能显示、按钮操作大于命令操作;

  • DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、
    MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面。
  1. windows创建工程文件夹

  2. DataGrip中创建新Project

  3. DataGrip连接Hive

  4. 配置配置Hiveserver2服务连接信息和Hive JDBC连接驱动

相关推荐
艾希逐月3 小时前
分布式唯一 ID 生成方案
分布式
齐木卡卡西在敲代码6 小时前
kafka的pull的依据
分布式·kafka
lllsure7 小时前
RabbitMQ 基础
分布式·rabbitmq
DN金猿10 小时前
rabbitmq发送的延迟消息时间过长就立即消费了
分布式·rabbitmq
程序员不迷路13 小时前
Kafka学习
分布式·kafka
北i14 小时前
ZooKeeper 一致性模型解析:线性一致性与顺序一致性的平衡
分布式·zookeeper·云原生
IT技术小密圈14 小时前
图解分布式锁: 5分钟搞懂分布式锁
分布式·后端·面试
bing_15814 小时前
kafka 生产者是如何发送消息的?
分布式·kafka
君不见,青丝成雪16 小时前
Hadoop技术栈(四)HIVE常用函数汇总
大数据·数据库·数据仓库·hive·sql
Monly2121 小时前
RabbitMQ:数据隔离
分布式·rabbitmq