2

我对 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 作业?

4

2 回答 2

1

Metastore 用于存储模式(表定义,包括 HDFS 中的位置、serde、列、注释、类型、分区定义、视图、访问权限等)和统计信息。没有将数据从 HDFS 移动到 Hive 这样的操作,因为 Hive 表数据存储在 HDFS(或其他兼容的文件系统,如 S3)中。您可以在 HDFS 的某个位置上定义新表甚至几个表并将文件放入其中。您可以更改现有表位置或分区位置,所有这些信息都存储在元存储中,因此 Hive 知道如何访问数据。表是元存储中定义的逻辑对象,数据本身只是 HDFS 中某个位置的文件。

另请参阅有关 Hive 查询执行流程(高级)的答案:https ://stackoverflow.com/a/45587873/2700344

于 2018-01-31T07:58:15.820 回答
1

Hive 执行 schema-on-read 操作,这意味着对于要以某种结构化方式处理的数据(即类似表的对象),需要将所述数据的布局汇总为关系结构

获取 HDFS 中文件的内容并创建它的元数据形式

据我所知,创建表时实际上没有读取任何文件。

SparkSQL 直接连接到元存储。Spark 和 HiveServer 都有自己的查询解析器。它不是元存储的一部分。MapReduce/Tez/Spark 作业也不由 Metastore 处理。它只是一个关系数据库。如果是 Mysql、Postgres 或 Oracle,您可以轻松地连接到它并检查内容。默认情况下,Hive 和 Spark 都使用嵌入式 Derby 数据库

于 2018-01-31T14:13:13.190 回答