hive 架构及 metastore 功能简单介绍

文章详细介绍了Hive的架构,包括HiveServer2和HiveMetastore的角色,以及数据读取过程中涉及的组件和流程。HiveMetastore仅存储元数据,不包含实际数据,而数据查询需要通过HiveServer2或者Spark来实现。此外,文章还讨论了Hive的数据模型,如Table、Partition和Bucket,以及HiveMetastore在元数据管理和分区存储位置管理中的作用。

这两天在调研用 java 怎么能通过 hive metastore 将 hive 表中的数据读出来(不能用 hive2),最好是能直接支持 sql 查询。各种查跟尝试,最终确定这条路走不通。期间研究了下 hive 的内部架构,其实就是看了一遍官方文档。记录下怕忘了。

hive 中主要有两个组件 hive server2hive metastore ,前者负责对外提供 DML 服务,后者记录了数据的元信息,在 sql 生成执行计划时为其提供依据。(为什么从 metastore 中查不了表中的数据,因为人家压根没存)。


hive 架构

在这里插入图片描述

这张图是从官网截的。里面展示了主要的组件以及它跟 hadoop(spark) 的交互。主要组件如下:

  • UI:用户提交查询或者其他操作给系统的接口,2011年以后支持命令行和 web GUI 两种操作接口。
  • Driver:该组件接收用户的操作请求(查询),支持来自 JDBC/ODBC 接口的请求,创建 session,执行请求并将结果返回。
  • Compiler:该组件在 metastore 的协助下解析查询语句,对不同的查询块和查询语句做语法分析并产生执行计划。
  • Metastore:该组件存储了数仓中全部表的结构信息和分区信息,包括列以及列类型信息。读写数据时所需的序列化和反序列化器,以及数据在HDFS上的位置信息。metastore 存储数据的元信息而非数据本身。
  • Execution Engine: 该组件负责执行由 compiler 产生的执行计划(由多个stage构成的有向无环图)。它管理着执行计划中不同 stage之间的依赖关系并且在恰当的系统组件中执行 stage。

上图也展示了典型的查询操作的执行过程。通过交互接口将查询请求提交到 Driver(step 1)。Driver 为查询语句创建 session 并将其发送到 compiler 生成执行计划 (step 2)。compiler 从 metastore 中获取必要的元信息(steps 3 and 4)。compiler 生成的查询计划是由多个 stage 构成的有向无环图,并且每个 stage 都是将是一个 mapreduce 任务。Execution Engine 管理并提交这些 stage 到正确的组件(steps 6, 6.1, 6.2 and 6.3)。图中所画的 stage 被提交到 hadoop 上执行,而且是早期的 hadoop (目前已不被使用),也可以将 stage 提交到 spark 执行。每个任务执行时读取 hive 表中的数据实际上是使用该表对应的反序列化器直接从 HDFS 上读取数据,并且操作这些数据。生成的中间输出又被使用序列化器写在了 HDFS 的临时文件中供后续使用。对于 DML 操作最终的临时文件会被移动到表的位置,该方案确保了不会读到脏数据。对于查询请求,执行引擎直接从 HDFS 上读取最终文件,并将结果返回给 Driver(steps 7, 8 and 9)。


Hive 数据模型

HIve 中的数据被组织成:

  • Table:HIve 表类似于关系型数据库表,filtered, projected, joined 和 union 这些功能都有,表中的数据直接存储在 HDFS 上。支持外表。
  • Partitions:表中的数据可以拥有一个或多个分区,分区决定的数据在 HDFS 上如何存储,分区相同的数据存储在同一目录下。当存在多个分区时,会出现目录嵌套。通常会以时间作为分区。
  • Buckets:这个概念翻译成中文叫 块、桶、有时候也叫分区,但”分区“的称呼容易和上面的概念混淆。表中同一个分区分数据会被按照某个列的 hash 值再进一步划分成块,每一块作为一个单独的文件。最终的样子是 表中相同分区的数据存储在同一目录下,该目录下有好多个文件。块的出现提高了查询的效率。

Metastore

设计初衷

Hive Metastore的设计初衷是为了解决Hive中表和分区的元数据管理问题。在Hive中,表和分区的元数据包括表名、列名、数据类型、分区键、存储位置等信息,这些元数据需要被存储和管理。Hive Metastore就是为了管理这些元数据而设计的。在没有Hive Metastore的情况下,Hive会将表和分区的元数据存储在HDFS的元数据文件中,这些文件通常被称为Hive元数据存储目录。Hive会在该目录下创建一个与表名相同的目录,并在该目录下创建一个名为“_metadata”的文件,该文件包含表的元数据信息,如表名、列名、数据类型等。对于分区,Hive会在表的元数据文件中记录分区键和分区值,但是不会记录分区的存储位置。因此,在没有Hive Metastore的情况下,用户需要手动管理分区的存储位置,这可能会导致分区管理的不便和效率低下。

具体来说,用户需要在HDFS中为每个分区创建一个目录,并将该分区的数据存储在该目录下。例如,如果有一个名为“sales”的表,其中包含一个名为“2019”的分区,用户可以按照以下步骤手动管理该分区的存储位置:

  1. 在HDFS中创建一个名为“sales”的目录,该目录将用于存储“sales”表的数据。
  2. 在“sales”目录下创建一个名为“2019”的目录,该目录将用于存储“2019”分区的数据。
  3. 将“2019”分区的数据存储在“sales/2019”目录下。

在手动管理分区存储位置时,需要注意以下几点:

  1. 分区目录的命名必须与分区键的值相同,例如,“2019”分区的目录名必须为“2019”。
  2. 分区目录必须位于表的存储目录下,例如,“2019”分区的目录必须位于“sales”表的存储目录下。
  3. 分区目录的权限必须与表的存储目录相同,以确保Hive可以访问该目录中的数据。

Metastore 如何管理元数据和分区?

  1. 存储表和分区元数据:Hive Metastore可以存储表和分区的元数据信息,包括表名、列名、数据类型、分区键、存储位置等。当用户创建或修改表和分区时,Hive Metastore会自动更新元数据信息。
  2. 支持元数据查询:Hive Metastore可以支持元数据查询,用户可以通过Hive SQL语句查询表和分区的元数据信息。Hive Metastore会自动将查询转换为对元数据存储的操作,从而实现对元数据的高效查询。
  3. 支持元数据修改:Hive Metastore可以支持元数据修改,用户可以通过Hive SQL语句修改表和分区的元数据信息。Hive Metastore会自动将修改转换为对元数据存储的操作,从而实现对元数据的高效修改。
  4. 支持元数据版本控制和事务管理:Hive Metastore可以支持元数据版本控制和事务管理,用户可以通过Hive SQL语句对元数据进行版本控制和事务管理,从而保证元数据的一致性和可靠性。
  5. 管理分区存储位置:Hive Metastore可以自动管理分区的存储位置,当用户创建或修改分区时,Hive Metastore会自动将分区数据存储在正确的位置。用户无需手动管理分区的存储位置,从而提高了分区管理的效率和可靠性。
  6. 支持分区查询:Hive Metastore可以支持分区查询,用户可以通过Hive SQL语句查询分区数据。Hive Metastore会自动将查询转换为HDFS文件系统的操作,从而实现对分区数据的高效查询。
  7. 支持分区权限控制:Hive Metastore可以支持分区权限控制,用户可以通过Hive SQL语句设置分区的访问权限,从而保护分区数据的安全性。

总之,Hive Metastore可以自动管理分区的存储位置和元数据信息,从而提高了分区管理的效率和可靠性。同时,Hive Metastore还支持分区查询和权限控制等功能,为用户提供了更加全面的分区管理解决方案和更搞笑的查询效率。

metadata 对象
  • Database:表的命名空间。
  • Table:表的 Metastore 中包含了所有列、owner、存储、序列化与反序列化信息,还可以继续包含用户指定的键值对。存储信息包括表中数据的位置信息、文件的输入输出格式、桶信息。所有的元信息在表被创建时就生成并且存储了。
  • Partition:每个分区都有自己的列信息、序列化和反序列化以及存储信息。这么做是为了在不影响了老分区的前提下修改 schema。

几个小问题

1. hive metastore 比 hive server2 有什么区别?

功能不一样,hive2 对外提供数据查询功能,Metastore 管理 hive表的元数据信息,对外提供元数据信息查询功能。

2. 通过 Hive Metastore 能查询表中的数据吗?

不能。通过 Hive Metastore 本身是不能查询表中的数据的,因为 Hive Metastore 只是 Hive 的元数据存储服务,它负责管理 Hive 表的元数据信息,包括表的结构、分区信息、表的位置等,而不是存储表中的实际数据。要查询 Hive 表中的数据,需要使用 hive2 查询。在使用 Hive 查询服务时,它们会通过 Hive Metastore 获取表的元数据信息,包括表的结构、分区信息、表的位置等,然后根据这些信息从存储系统中读取表中的实际数据。因此,Hive Metastore是Hive查询服务的一个重要组件,但它本身并不能查询表中的数据。

3. 为什么 spark 可以通过 Hive Metastore 读取出表中的数据?

Spark 可以通过 Hive Metastore 读取 Hive 表中的数据,是因为 Spark SQL 和 Hive 都是基于Hadoop生态系统的,它们共享Hadoop的存储和计算资源。具体来说,Spark SQL可以通过Hive Metastore获取Hive表的元数据信息。也就是说 spark 知道它要使用的数据有哪些并且在哪里存放着,接下来 spark 任务自己就到 HDFS 上读数据了,此时不用再使用 hive2,而且整个读写与计算的过程都是在集群内,数据安全有保证。

### Hive 架构详解及组成部分 Hive 是一种建立在 Hadoop 上的数据仓库工具,用于大规模数据分析。其架构设计使得它能够高效地查询和分析存储在分布式文件系统上的大数据集[^1]。 #### 1. Hive 的核心组件 Hive架构由多个核心组件构成,这些组件共同协作完成数据的查询、处理和存储任务: - **MetaStore**: MetaStore 存储了 Hive 中所有的元数据信息,包括表定义、列属性、分区详情等。默认情况下,MetaStore 使用 Derby 数据库作为存储引擎,但在生产环境中通常建议使用 MySQL 或 PostgreSQL 来提高性能和可靠性[^5]。 - **Driver (驱动器)**: Driver 是整个 Hive 查询执行的关键部分,负责接收用户的 SQL/HQL 请求并将其转化为一系列可执行的任务。具体来说,Driver 将请求传递给编译器(Compiler),再通过优化器(Optimizer)生成最终的执行计划[^2]。 - **Compiler (编译器)**: 编译器的主要职责是对输入的 HiveQL 进行语法解析(Syntax Parsing)、语义验证(Semantic Analysis)以及逻辑计划(Logical Plan Generation)[^4]。这一阶段会确保提交的查询符合 Hive 的语法规则,并且所有涉及的对象(如表、视图)都存在且有效。 - **Optimizer (优化器)**: 经过编译后的逻辑计划会被送入 Optimizer 阶段,在这里会对查询进行各种转换操作以提升效率,比如谓词下推(Predicate Pushdown)、常量折叠(Constant Folding)等技术的应用可以减少不必要的计算开销[^3]。 - **Executor (执行器)**: Executor 接收来自 Optimizer 的物理执行计划,并实际调度 MapReduce 或 Tez 等框架来运行具体的作业实例[^4]。 - **Storage Handler (存储处理器)**: Storage Handlers 定义了如何读写不同类型的底层数据源,默认支持的是基于 HDFS 文件系统的文本格式化数据,但也允许扩展到其他 NoSQL 解决方案或者关系型数据库中去访问异构数据[^1]。 #### 2. Hive 工作原理 当用户向 Hive 提交一条查询命令时,大致经历了以下几个步骤: - 用户通过 CLI(Client Interface)或者其他接口发送查询指令; - Query Parser 对该字符串形式的查询做初步解析得到 AST(Abstract Syntax Tree); - Semantic Analyzer 执行更深层次的意义检查确认无误之后构建 Logical Operator DAG; - Physical Planner 结合 Cost Model 和 Statistics Information 创建最优路径规划即 Execution Plan; - Task Dispatcher 根据这个 plan 划分成若干子 task 分发至各个节点上并发执行直至返回结果集结束整个流程[^4]。 ```python from pyhive import hive # Connect to the local default instance of Hive conn = hive.Connection(host='localhost', port=10000, username='your_username') cursor = conn.cursor() cursor.execute('SELECT * FROM your_table LIMIT 10') for result in cursor.fetchall(): print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值