一、Hive介绍

1 hive hive2区别 hive3跟hive2对比_1 hive hive2区别

Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言 HQL,用于访问和分析存储在Hadoop文件中的大型数据集。

Hive的核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行。这里需要注意下:在 Hive2 中,由于MapReduce的特征,就已经不建议继续使用MapReduce运算,推荐使用速度更快的 sparktez

Hive 的优点:

  • 简化了学习成本:避免直接写MapReduce,减少开发人员的学习成本。
  • 提升开发效率:操作接口采用类SQL语法,简单、容易上手。
  • 支持自定义函数:扩展能力强
  • 依靠于 Hadoop:利用HDFS存储数据,默认利用MapReduce查询分析数据,可以有效利用 Hdoop 的优点。

Hive的特点

Hive 的数据模型类似于 RDBMS 库表结构,并且还有自己特有模型,在粒度级别上可以分为:database数据库、Table 表、Partition分区、Bucket 分桶

其中 Table 表 可以理解称 HDFS 中的某个目录,Partition分区 表示文件根据某种规则拆分到不同的目录文件下存储,Bucket 分桶表示具体存放数据的文件。

1. 数据库

Hive 中也类似于 RDBMS 中有数据库,并且数据库也有 Schema 的概念,每个数据库下面有各自的表组成。默认的数据库为 default。数据默认存储在 HDFS 中的 /user/hive/warehouse 下,可以通过修改 Hive 的配置文件
hive-site.xml 中的 hive.metastore.warehouse.dir 制定存储根目录。

2. 数据表

Hive 中的表的元数据是存储在RDBMS中的,比如可以配置存储在 MySql 中。Hive有两种类型的表:Managed Table内部表、托管表、External Table外部表,默是情况下是内部表。

在创建表时,如果没有 external 修饰则是内部表,有external修饰则是外部表,内部表的数据是Hive自身管理,外部表数据由HDFS管理,外部表的数据存储位置可以自己指定,比如指定 /user/hive/warehouse 之外的路径。在删除时如果删除的时内部表,则会删除元数据和存储数据,如果时外部表仅删除元数据,在HDFS上的文件不会删除。

3. Partitions 分区

Partitions 分区,类似于数据库的分库分表,可以根据某个列(例如:时间、地区等)将表划分为不同分区。有效减少某个文件的大小,增加读的速度。分区在存储层面上的表现为,表目录下的子目录的形式存在。一个目录表示一个分区。子目录命名方式为:分区列=分区值,另外还支持多重分区,在分区下继续创建子分区。

4. Buckets

Buckets 分桶是指根据表中的某个字段(例如:id,手机号等)的值,经过hash计算规则将数据文件划分成指定的若干个小文件。这样的好处是可以优化 join 查询并方便抽样查询。Bucket 分桶hdfs 中表现为同一个表目录下数据根据 hash 散列之后的多个不同文件。

1 hive hive2区别 hive3跟hive2对比_1 hive hive2区别_02

Hive 对比 MySQL

Hive具有数据库的外表,SQL操作的语法使得 Hive 上手起来非常容易,但Hive 的应用场景却和 MySQL 完全不同。Hive由于其实时性较低,执行延迟大,比较适合用来做海量数据的离线分析。定位是数据仓库,面向分析的OLAP系统。而 MySQL 适合承担业务场景的数据处理,只要面向 OLTP 系统。

Hive

MySQL

定位

数据仓库

业务数据库

场景

OLAP

OLTP

查询语言

HQL

SQL

存储方式

HDFS

所在安装文件系统磁盘

执行引擎

MR、Tez、Spark

Excutor

执行延迟



处理数据量



常用操作

批量导入数据、聚合查询统计

增删改查

Hive的部署组件

1. Metadata元数据存储方式

元数据包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据是存储在关系型数据库中。如 hive 内置的Derby,也可以存储在第三方如MySQL中。

2.Metastore元数据服务

Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。保证了元数据的安全。

metastore 有三种配置方式:内嵌模式(使用内置的Derby)、本地模式、远程模式。

  • 内嵌模式metastore 默认的部署模式。此种模式下,元数据存储在内置的Derby数据库,并且Derby数据库和metastore服务都嵌入在主HiveServer进程中,当启动HiveServer进程时,Derbymetastore都会启动。不需要额外起Metastore服务。但是一次只能支持一个活动用户,仅适用于测试体验,不适用于其他环境。
  • 本地模式Hive Metastore服务与主HiveServer进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。metastore服务将通过JDBCmetastore数据库进行通信。这种方式的缺点是每启动一次hive服务,都内置启动了一个metastore
  • 远程模式Metastore服务在其自己的单独JVM上运行,而不在HiveServerJVM中运行。如果其他进程希望与Metastore服务器通信,则可以使用Thrift Network API进行通信。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。这种方式需要单独手动启动 metastore服务。

二、Hive 内嵌模式初体验

在安装前,需要确保已经安装好了 Hadoop 环境,并且启动Hadoop 环境,如果不了解可以参考下面我的博客:

Hadoop3 - 集群搭建

首先下载 Hive 的安装包:

https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz

将下载后的安装包上传至服务器中:

解压安装包:

tar zxvf apache-hive-3.1.2-bin.tar.gz

进去到安装目录:

cd apache-hive-3.1.2-bin/

Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:

rm -rf lib/guava-19.0.jar

Hadoop 中的依赖包 Copy 过来:

cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:

mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh

追加下面数据,注意 HadoopHive 的安装目录修改为自己真实的

export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

1 hive hive2区别 hive3跟hive2对比_hive_03

初始化 metadata

bin/schematool -dbType derby -initSchema

启动hive服务:

bin/hive

1 hive hive2区别 hive3跟hive2对比_hive_04


测试查看数据库:

show databases;

1 hive hive2区别 hive3跟hive2对比_hive_05


测试创建数据库:

create database bxc;

1 hive hive2区别 hive3跟hive2对比_MySQL_06


到 HDFS 中查看文件:

1 hive hive2区别 hive3跟hive2对比_1 hive hive2区别_07

三、Hive本地模式安装

本地模式这里选用 MySQL 存储元数据,在安装前需要安装好 MySQL 环境。还需将MySQL 的驱动包放置 Hivelib/ 目录下,找不到的该文件的可以去 Maven 仓库中下载一个,拷贝出来上传到服务器中。

scp F:/bigdata/mysql-connector-java-5.1.32.jar  root@192.168.40.172:/export/hive/apache-hive-3.1.2-bin/lib

Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:

rm -rf lib/guava-19.0.jar

Hadoop 中的依赖包 Copy 过来:

cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:

mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh

追加下面数据,注意 HadoopHive 的安装目录修改为自己真实的

export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

1 hive hive2区别 hive3跟hive2对比_1 hive hive2区别_08

新增 hive-site.xml 配置 MySQL 相关信息:

vi conf/hive-site.xml

添加下面内容,注意MySQL的链接换成自己的:

<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
    </property>

	 <!-- 这里注意MySQL 版本,我的是 5.X , 如果是 8 需要换成 8 的驱动 -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

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

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

    <!-- 关闭元数据存储授权  -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>

    <!-- 关闭元数据存储版本的验证 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
</configuration>

初始化 metadata

bin/schematool -initSchema -dbType mysql -verbos

初始化后,可以去MySQL 中看下是否有创建 Hive74 张表:

1 hive hive2区别 hive3跟hive2对比_Hive_09

启动hive服务:

bin/hive

1 hive hive2区别 hive3跟hive2对比_hadoop_10

测试查看数据库:

show databases;

1 hive hive2区别 hive3跟hive2对比_hadoop_11


测试创建数据库:

create database bxc;

1 hive hive2区别 hive3跟hive2对比_hive_12

四、Hive远程模式安装

在安装之前先了解下Hive的客户端,上面使用的都是 Hive Client 属于第一代客户端,在 Hive 的发展中还有个 Hive Beeline Client 属于第二代客户端,第一代客户端已经不推荐使用了,第二代客户端:$HIVE_HOME/bin/beeline是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。

Beeline Shell在嵌入式模式和远程模式下均可工作。在嵌入式模式下,它运行嵌入式 Hive(类似于Hive Client),而远程模式下beeline通过 Thrift 连接到单独的 HiveServer2 服务上,这也是官方推荐在生产环境中使用的模式。因此在该模式下还要多部署一个 HiveServer2 服务。

同样需要提前安装好 MySQL 环境,以及将 MySQL 驱动包放到 Hive 的 lib 下。

在开始前,先修改 Hadoop 中的 core-site.xml 文件,增加下面两个配置,不然在使用 beeline 远程登录的时候,回报错:root is not allowed to impersonate root 异常:

<!-- 整合hive -->
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
 
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

修改后重启 Hadoop 环境。

Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:

rm -rf lib/guava-19.0.jar

Hadoop 中的依赖包 Copy 过来:

cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:

mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh

追加下面数据,注意 HadoopHive 的安装目录修改为自己真实的

export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

1 hive hive2区别 hive3跟hive2对比_hadoop_13

新增 hive-site.xml 配置 MySQL 相关信息:

vi conf/hive-site.xml

添加下面内容,注意MySQL的链接换成自己的:

<configuration>
    <!-- 存储元数据mysql相关配置 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
    </property>

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

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

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

    <!-- H2S运行绑定host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>192.168.40.172</value>
    </property>

    <!-- 远程模式部署metastore 服务地址 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.40.172:9083</value>
    </property>

    <!-- 关闭元数据存储授权  -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>

    <!-- 关闭元数据存储版本的验证 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
</configuration>

初始化 metadata

bin/schematool -initSchema -dbType mysql -verbos

初始化后,可以去MySQL 中看下是否有创建 Hive74 张表:

1 hive hive2区别 hive3跟hive2对比_1 hive hive2区别_14


启动 Metastore 服务:

nohup bin/hive --service metastore &

查看是否启动成功:

1 hive hive2区别 hive3跟hive2对比_MySQL_15


如果启动失败,可以前台启动并打印debug日志:

bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console

下面启动hive服务,测试是否启动成功:

bin/hive

测试创建数据库:

create database bxc;

1 hive hive2区别 hive3跟hive2对比_hadoop_16

远程连接配置

远程模式下方便使用 Hive Beeline Client 进行远程连接,需要启动 HiveServer2

nohup bin/hive --service hiveserver2 &

1 hive hive2区别 hive3跟hive2对比_hive_17


使用 beeline 客户端远程连接 Hive

bin/beeline

1 hive hive2区别 hive3跟hive2对比_hive_18


连接远程 Hive 服务:

! connect jdbc:hive2://192.168.40.172:10000

用户名为 root,密码随意字符即可:

1 hive hive2区别 hive3跟hive2对比_Hive_19

测试查看数据库:

show databases;

1 hive hive2区别 hive3跟hive2对比_Hive_20


可以看到展示效果比使用 bin/hive 要好。