九、元数据管理和存储

1. Metastore

  • 在Hive的具体使用中,首先面临的问题便是如何定义表结构信息,跟结构化的数据映射成功。所谓的映射指的是一种对应关系。在Hive中需要描述清楚表跟文件之间的映射关系、列和字段之间的关系等等信息。这些描述映射关系的数据的称之为Hive的元数据。元数据十分重要,因为只有通过查询它才可以确定用户编写sql和最终操作文件之间的关系。
  • Metadata即元数据。元数据包含用Hive创建的database、table、表的字段等元信息。元数据存储在关系型数据库中。如hive内置的Derby、第三方如MySQL等。
  • Metastore即元数据服务,是Hive用来管理库表元数据的一个服务。有了它上层的服务不用再跟裸的文件数据打交道,而是可以基于结构化的库表信息构建计算框架。
  • 通过metastore服务将Hive的元数据暴露出去,而不是需要通过对Hive元数据库mysql的访问才能拿到Hive的元数据信息;metastore服务实际上就是一种thrift服务,通过它用户可以获取到Hive元数据,并且通过thrift获取元数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等细节。

    metastore三种配置方式

    1、内嵌模式

  • 内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。

  • 优点:配置简单,解压hive安装包 bin/hive 启动即可使用;
  • 缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享

image.png

2、本地模式

  • 本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server。教学中实际采用的是MySQL。
  • 本地模式不需要单独起metastore服务,用的是跟Hive在同一个进程里的metastore服务。也就是说当启动一个hive 服务时,其内部会启动一个metastore服务。Hive根据 hive.metastore.uris 参数值来判断,如果为空,则为本地模式
  • 缺点:每启动一次hive服务,都内置启动了一个metastore;在hive-site.xml中暴露的数据库的连接信息;
  • 优点:配置较简单,本地模式下hive的配置中指定mysql的相关信息即可

image.png

3、远程模式

  • 远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。在生产环境中,建议用远程模式来配置 Hive Metastore
  • 在这种模式下,其他依赖hive的软件都可以通过Metastore访问Hive。此时需要配置 hive.metastore.uris 参数来指定 metastore 服务运行的机器ip和端口,并且需要单独手动启动metastore服务。metastore服务可以配置多个节点上,避免单节点故障导致整个集群的hive client不可用。同时hive client配置多个metastore地址,会自动选择可用节点

    image.png

    ① 内嵌模式配置

    1、下载软件解压缩至 linux121机器

  • 可以通过 linux123 复制安装包到 linux121

    • scp /opt/lagou/software/software-hive/apache-hive-2.3.7-bin.tar.gz linux121:$PWD
    • 其中 $PWD 指的是源机器的工作目录(而不是目标机器的工作目录)

2、设置环境变量,并使之生效.

  • 与本地模式相同

3、初始化数据库。

  • schematool -dbType derby -initSchema

4、进入hive命令行

  • 可以执行命令

5、再打开一个hive命令行,发现无法进入(只支持单用户、单进程)

② 本地模式配置

1、将 linux123 的 hive 安装文件拷贝到 linux121、linux122(环境变量设置好)
2、在linux121、linux123上分别启动 metastore 服务

  1. # 后台启动 metastore 服务
  2. nohup hive --service metastore &
  3. # 安装lsof
  4. yum install lsof
  5. # 查询9083端口(metastore服务占用的端口)
  6. lsof -i:9083

3、修改 linux122 上hive-site.xml。因为linux122不提供metastore服务,因此可以删除配置文件中关于 MySQL的配置、连接数据库的用户名、口令等信息;并增加连接metastore的配置:

  • 注:提供metastore远程服务的节点(如linux121,linux123)上,其hive配置文件上的关于存储元数据的关系型数据库(如mysql)的信息 不能删除
    <!-- hive metastore 服务地址 -->
    <property>
       <name>hive.metastore.uris</name>
       <value>thrift://linux121:9083,thrift://linux123:9083</value>
    </property>
    

4、启动hive。此时client端无需实例化hive的metastore,启动速度会加快。

# 分别在linux121、linux123上执行以下命令,查看连接情况
lsof -i:9083

5、高可用测试。关闭已连接的metastore服务,发现hive连到另一个节点的服务上,仍然能够正常使用

  • 比如关掉 linux123 的metastore服务:先用jps命令查看 进程 RunJar的端口,比如是11062,然后杀死该进程:kill -9 11062(-9 表示强制执行)

    2. HiveSever2

  • HiveServer2是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证,启动hiveServer2服务后,就可以使用jdbc、odbc、thrift 的方式连接
  • Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的

image.png

  • HiveServer2(HS2)是一种允许客户端对Hive执行查询的服务。HiveServer2是HiveServer1的后续版本。HS2支持多客户端并发和身份验证,旨在为JDBC、ODBC等开放API客户端提供更好的支持。
  • HS2包括基于Thrift的Hive服务(TCP或HTTP)和用于Web UI 的Jetty Web服务器

HiveServer2作用:

  • 为Hive提供了一种允许客户端远程访问的服务
  • 基于thrift协议,支持跨平台跨编程语言对Hive访问
  • 允许远程访问Hive

HiveServer2配置

  • 配置规划:

    image.png

  • 配置步骤:

    • 注:可以先改其中一个机器的配置,在复制到集群的其他机器中

1、修改集群上的 core-site.xml,增加以下内容:

<!-- 为了使得HiveServer2更好用,需要配置;hadoop为安装用户 -->
<!-- root用户可以代理所有主机上的所有用户,修改的是权限 -->
<property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
</property>

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

<!-- hadoop为安装用户 -->
<property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
</property>
<property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
</property>

2、修改集群上的 hdfs-site.xml,增加以下内容:

<!-- HiveServer2 连不上10000;启用 webhdfs 服务 -->
<property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
</property>

3、启动linux123上的 HiveServer2 服务
前提是正常启动 hdfs 和 yarn 集群

# 启动 hiveserver2 服务
nohup hiveserver2 &

# 检查 hiveserver2 端口
lsof -i:10000

# 从2.0开始,HiveServer2提供了WebUI
# 还可以使用浏览器检查hiveserver2的启动情况。http://linux123:10002/(10002是hive2的web端口,要与10000区分开)

4、启动 linux122 节点上的 beeline

  • Beeline是从 Hive 0.11版本引入的,是 Hive 相对新的命令行客户端工具。
  • Hive客户端工具后续将使用Beeline 替代 Hive 命令行工具 ,并且后续版本也会废弃掉 Hive 客户端工具。 ```sql

    在$HIVE_HOME/bin下启动 beeline

    [root@linux122 bin]# ./beeline

从linux122的beeline中连接 linux123的 hive2服务

beelinee> !connect jdbc:hive2://linux123:10000; #后续需要验证用户名和密码,由于我们没有设置,因此可以直接回车

这时候可以在hive2中输入sql语句了

0: jdbc:hive2://linux123:10000> use mydb; 0: jdbc:hive2://linux123:10000> show tables; 0: jdbc:hive2://linux123:10000> select * from emp; 0: jdbc:hive2://linux123:10000> create table tabtest1 (c1 int, c2 string);

也可以通过beeline连接mysql服务,查看元数据的数据库

beelinee> !connect jdbc:mysql://linux123:3306 #后续需要输入用户名和密码,输入我们之前设置的用户名和密码

同样,这时候可以操作mysql数据库了

1: jdbc:mysql://linux123:3306> show databases; 1: jdbc:mysql://linux123:3306> use hivemetadata; 1: jdbc:mysql://linux123:3306> select * from VERSION;

<a name="W7Pif"></a>
## 3. HCatalog

- HCatalog 提供了一个统一的元数据服务,允许不同的工具如 Pig、MapReduce 等通过 HCatalog 直接访问存储在HDFS 上的底层文件。HCatalog是用来访问Metastore的Hive子项目,它的存在给了整个Hadoop生态环境一个统一的定义。
- HCatalog 使用了 Hive 的元数据存储,这样就使得像 MapReduce 这样的第三方应用可以直接从 Hive 的数据仓库中读写数据。同时,HCatalog 还支持用户在 MapReduce 程序中只读取需要的表分区和字段,而不需要读取整个表,即提供一种逻辑上的视图来读取数据,而不仅仅是从物理文件的维度。
- HCatalog 提供了一个称为 hcat 的命令行工具。这个工具和 Hive 的命令行工具类似,两者最大的不同就是 hcat 只接受不会产生 MapReduce 任务的命令(DDL命令,如建表命令)。
- **备注**
   - 在这里只是介绍HCatalog的服务,一般不常用,以后我们使用的是 HCatalog提供的API
```sql
# 进入 hcat 所在目录。$HIVE_HOME/hcatalog/bin
cd $HIVE_HOME/hcatalog/bin

# 执行命令,创建表(因为没有添加给hcat添加环境变量,因此 hcat 并不能直接执行,而是需要 ./hcat)
./hcat -e "create table default.test1(id string, name string, age int)"

# 长命令可写入文件,使用 -f 选项执行
./hcat -f createtable.txt

# 查看元数据
./hcat -e "use mydb; show tables"

# 查看表结构
./hcat -e "desc mydb.emp"

# 删除表
./hcat -e "drop table default.test1"

4. 数据存储格式

  • Hive支持的存储数的格式主要有:textfile(默认格式)、sequencefile、rcfile、orcfile、parquet

    • textfile 为默认格式,建表时没有指定文件格式,则默认使用textfile,导入数据时会直接把数据文件拷贝到hdfs上不进行处理
    • sequencefile、rcfile、orcfile格式的表不能直接从本地文件中导入(因为一般我们得到的数据文件格式都是textfile类型),数据先要导入到textfile格式的表中,然后再从该表insert到sequencefile、rcfile、orcfile格式的表中

      行存储和列存储

  • 行式存储下的一张表的数据都是放在一起的,但是列式存储下的数据被分开保存了

    • 行式存储
      • 优点:数据被保存在一起,insert和update操作更简单
      • 缺点:select操作时即使只涉及到某几列,所有数据均会被读取,很耗费I/O资源
    • 列式存储
      • 优点:查询时只有涉及到的列会被读取,效率高
      • 缺点:选中的列要重新组装,insert和update操作比较麻烦
  • textfile、sequencefile 基于行存储
  • rcfile、orcfile、parquet 基于列存储

image.png

文件格式介绍

textfile【重要】

  • Hive默认的数据存储格式,数据不做压缩,磁盘开销大,数据解析开销大。 可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。 ```sql create table if not exists uaction_text( userid string, itemid string, behaviortype int, geohash string, itemcategory string, time string ) row format delimited fields terminated by ‘,’ stored as textfile;

load data local inpath ‘/home/hadoop/data/uaction.dat’ overwrite into table uaction_text;

<a name="N9Fau"></a>
#### sequencefile

- 不常用
- SequenceFile是Hadoop API提供的一种二进制文件格式,其具有使用方便、可分割、可压缩的特点。SequenceFile支持三种压缩选择:none,record,block。Record压缩率低,**一般建议使用 BLOCK 压缩**
<a name="VhtyU"></a>
#### rcfile

- RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对数据文件。RCFile **结合列存储和行存储的优缺点**,是基于行列混合存储的RCFile
- RCFile遵循的“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组(row group),这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分

![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1606613918749-123a5c45-8184-4b47-ae5e-34c70009691c.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_TGFuY2VNYWk%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#align=left&display=inline&height=338&margin=%5Bobject%20Object%5D&name=image.png&originHeight=575&originWidth=946&size=219514&status=done&style=shadow&width=556)

- 一张表可以包含多个HDFS block
- 在每个block中,RCFile以行组为单位存储其中的数据
- row group又由三个部分组成
   - 用于在block中分隔两个row group的16字节的标志区
   - 存储row group元数据信息的header
   - 实际数据区,表中的实际数据以列为单位进行存储
<a name="wDKgd"></a>
#### orcfile【重要】
ORC File,它的全名是Optimized Row Columnar (ORC) file,RCFile的升级版,在hive 0.11中引入的存储格式。这种文件格式可以提供一种高效的方法来存储Hive数据。它的设计目标是来克服Hive其他格式的缺陷。运用ORC File可以提高Hive的读、写以及处理数据的性能。

ORC文件结构由三部分组成:

- 文件脚注(file footer):包含了文件中 stripe 的列表,每个stripe行数,以及每个列的数据类型。还包括每个列的最大、最小值、行计数、求和等信息
- postscript:压缩参数和压缩大小相关信息
- 条带(stripe):ORC文件存储数据的地方。在默认情况下,一个stripe的大小为**250MB**
   - Index Data:一个轻量级的index,默认是每隔1W行做一个索引。包括该条带的一些统计信息,以及数据在stripe中的位置索引信息
   - Rows Data:存放实际的数据。先取部分行,然后对这些行按列进行存储(先水平划分,再垂直划分)。对每个列进行了编码,分成多个stream来存储
   - Stripe Footer:存放stripe的元数据信息

![image.png](https://cdn.nlark.com/yuque/0/2020/png/2322054/1606614115530-211edc37-e8a6-4960-83ab-73a945f9aac7.png#align=left&display=inline&height=527&margin=%5Bobject%20Object%5D&name=image.png&originHeight=794&originWidth=610&size=324056&status=done&style=shadow&width=405)

- ORC在每个文件中提供了3个级别的索引:**文件级**、**条带级**、**行组级**。借助ORC提供的索引信息能加快数据查找和读取效率,规避大部分不满足条件的查询条件的文件和数据块。使用ORC可以避免磁盘和网络IO的浪费,提升程序效率,提升整个集群的工作负载。
```sql
create table if not exists uaction_orc(
  userid string,
  itemid string,
  behaviortype int,
  geohash string,
  itemcategory string,
  time string
)
stored as orc;

insert overwrite table uaction_orc select * from uaction_text;

parquet【重要】

  • Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Mapreduce、Spark等),被多种查询引擎支持(Hive、Impala、Drill等),与语言和平台无关,通用性强
  • Parquet文件是以二进制方式存储的,不能直接读取的,文件中包括实际数据和元数据,Parquet格式文件是自解析

image.png

create table if not exists uaction_parquet(
  userid string,
  itemid string,
  behaviortype int,
  geohash string,
  itemcategory string,
  time string
)
stored as parquet;

insert overwrite table uaction_parquet select * from uaction_text;

文件存储格式对比测试

  • 说明
    • 在 linux123 上测试
    • 给 linux123 分配合适的资源,2core,2GB(前提是电脑有16G内存)
    • 适当减小文件的数据量(现有数据约800W,根据自己的实际选择处理100-300W条数据均可)
    • 测试时间会有点长 ```sql

      检查文件行数

      wc -l useraction.dat

查看部分数据

head -n 1000000 useraction.dat > useraction1.dat tail -n 1000000 useraction.dat > useraction2.dat


- 比较文件的压缩比
```sql
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/ua*;
13517070 /user/hive/warehouse/mydb.db/uaction_orc/000000_1000
34867539 /user/hive/warehouse/mydb.db/uaction_parquet/000000_1000
90019734 /user/hive/warehouse/mydb.db/uaction_text/useraction.dat

orc > parquet > textfile

  • 比较各种格式表格的查询效率 ```sql SELECT COUNT() FROM uaction_text; SELECT COUNT() FROM uaction_orc; SELECT COUNT(*) FROM uaction_parquet;

— text : 14.446s — orc: 0.15s — parquet : 0.146s ```

小结

  • 在生产环境中,hive表格的数据格式使用最多的有三种:textfile,orcfile,parquet
    • textfile文件更多的是作为跳板来使用(即方便将数据转为其他格式)
    • 有事务性操作(update、delete)的要求的,必须是orcfile格式
    • 希望文件被多种计算框架 或 多种查询引擎支持,使用 parquet