Hive 中 MetaStore 的主要用途?
Posted
技术标签:
【中文标题】Hive 中 MetaStore 的主要用途?【英文标题】:Main purpose of the MetaStore in Hive? 【发布时间】:2018-01-31 00:46:49 【问题描述】:我对 MetaStore 的用途有些困惑。在 hive 中创建表时:
CREATE TABLE <table_name> (column1 data_type, column2 data_type);
LOAD DATA INPATH <HDFS_file_location> INTO table managed_table;
所以我知道这个命令获取文件在 HDFS 中的内容并创建它的 MetaData 形式并将其存储在 MetaStore 中(包括每行的列类型、列名、它在 HDFS 中的位置等在 HDFS 文件中)。它实际上并没有将数据从 HDFS 移动到 Hive。
但是存储这个元数据的目的是什么?
例如,当我使用 Spark SQL 连接到 Hive 时,MetaStore 不包含 HDFS 中的实际信息,而只包含 MetaData。那么 Hive 是否仅使用 MetaStore 来针对 HiveQL 查询执行解析和编译步骤并创建 MapReduce 作业?
【问题讨论】:
【参考方案1】:Metastore 用于存储模式(表定义,包括 HDFS 中的位置、serde、列、cmets、类型、分区定义、视图、访问权限等)和统计信息。没有将数据从 HDFS 移动到 Hive 这样的操作,因为 Hive 表数据存储在 HDFS(或其他兼容的文件系统,如 S3)中。您可以在 HDFS 的某个位置上定义新表甚至几个表并将文件放入其中。您可以更改现有表位置或分区位置,所有这些信息都存储在元存储中,因此 Hive 知道如何访问数据。表是 Metastore 中定义的逻辑对象,数据本身只是 HDFS 中某个位置的文件。
另请参阅有关 Hive 查询执行流程(高级)的答案:https://***.com/a/45587873/2700344
【讨论】:
但是当你创建一个内部表时,HDFS中的文件中的数据是不是移动到了Hive Warehouse目录:/user/warehouse/hive? @ToothyRel 当您删除管理表时,数据也将被删除。这就是外部表和托管表之间的所有区别。当您删除外部表时,数据将保留。因此,当您不再需要表后不想麻烦删除它的数据时,请创建托管表。还有临时表,它们会在会话结束后自动删除。托管表也可以在 HDFS 中的任何位置创建。 @ToothyRel 对,数据不会被移动、管理或不管理都没有关系。/user/warehouse/hive/table_name
如果您使用 SQL 插入数据并且未在表/分区 DDL 中定义另一个位置,则它可以是存储数据的默认位置。在 HDFS 表或分区中,数据是存储文件的文件夹。
这是 LOAD
命令将数据移动到表目录中,因为数据应该在表目录中才能从 Hive SQL 访问。您还可以使用cp
命令移动文件。每个分区都可以有自己的文件夹。说白了,Hive表就是一个文件夹+表元数据。
表格数据应该在它的文件夹中。您可以在不移动数据的情况下将表挂载到某个文件夹的顶部,或者您可以使用 load 或 cp/distcp 或 mv 命令或 SQL 插入等将数据放入表文件夹中。表/分区是物理上的文件夹。并且数据应该在它的文件夹中才能访问。【参考方案2】:
Hive 执行 schema-on-read 操作,这意味着对于要以某种结构化方式处理的数据(即类似表的对象),需要将所述数据的布局汇总到关系结构中
在 HDFS 中获取文件的内容并创建它的元数据形式
据我所知,创建表时实际上不会读取任何文件。
SparkSQL 直接连接到元存储。 Spark 和 HiveServer 都有自己的查询解析器。它不是元存储的一部分。 MapReduce/Tez/Spark 作业也不由 Metastore 处理。它只是一个关系数据库。如果是 mysql、Postgres 或 Oracle,您可以轻松地连接到它并检查内容。默认情况下,Hive 和 Spark 都使用嵌入式 Derby 数据库
【讨论】:
以上是关于Hive 中 MetaStore 的主要用途?的主要内容,如果未能解决你的问题,请参考以下文章
大数据(Hive的MetaStore切换及其Hive的语法细节)