Hive 没有完全遵守 core-site.xml 中的 fs.default.name/fs.defaultFS 值

Jak*_*e Z 1 hadoop hive cloudera

我在名为hadoop.

core-site.xml文件的fs.defaultFS(相当于fs.default.name)设置为以下内容:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop:8020</value>
</property>
Run Code Online (Sandbox Code Playgroud)

我有一个非常简单的表test_table,该表当前存在于 HDFS 上的 Hive 服务器中。也就是说,它存储在/user/hive/warehouse/test_table. 它是在 Hive 中使用一个非常简单的命令创建的:

CREATE TABLE new_table (record_id INT);
Run Code Online (Sandbox Code Playgroud)

如果我尝试在本地将数据加载到表中(即使用LOAD DATA LOCAL),一切都会按预期进行。但是,如果数据存储在 HDFS 上并且我想从那里加载,则会出现问题。

我运行一个非常简单的查询来尝试加载:

hive> LOAD DATA INPATH '/user/haduser/test_table.csv' INTO TABLE test_table;
Run Code Online (Sandbox Code Playgroud)

这样做会导致以下错误:

FAILED: SemanticException [Error 10028]: Line 1:17 Path is not legal ''/user/haduser/test_table.csv'':
Move from: hdfs://hadoop:8020/user/haduser/test_table.csv to: hdfs://localhost:8020/user/hive/warehouse/test_table is not valid.
Please check that values for params "default.fs.name" and "hive.metastore.warehouse.dir" do not conflict.
Run Code Online (Sandbox Code Playgroud)

正如错误所述,它正试图从 移动hdfs://hadoop:8020/user/haduser/test_table.csvhdfs://localhost:8020/user/hive/warehouse/test_table。第一条路径是正确的,因为它引用了hadoop:8020; 第二条路径不正确,因为它引用了localhost:8020.

core-site.xml文件明确指出要使用hdfs://hadoop:8020. 中的hive.metastore.warehousehive-site.xml正确指向/user/hive/warehouse。因此,我怀疑此错误消息是否具有任何真实价值。

创建表时如何让 Hive 服务器使用正确的 NameNode 地址?

Jak*_*e Z 5

我发现 Hive Metastore 会跟踪每个表的位置。您可以在 Hive 控制台中看到该位置正在运行以下内容。

hive> DESCRIBE EXTENDED test_table;
Run Code Online (Sandbox Code Playgroud)

因此,如果core-site.xml在 Metastore 服务仍在运行时更改了 NameNode,则会出现此问题。因此,要解决此问题,应在该机器上重新启动该服务:

$ sudo service hive-metastore restart
Run Code Online (Sandbox Code Playgroud)

然后,Metastore 将使用 newfs.defaultFS用于新创建的表。

已经存在的表

可以通过运行以下一组命令来更正已存在的表的位置。这些是从 Cloudera文档中获得的,用于配置 Hive Metastore 以使用高可用性。

$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://localhost:8020/user/hive/warehouse
hdfs://localhost:8020/user/hive/warehouse/test.db
Run Code Online (Sandbox Code Playgroud)

更正 NameNode 位置:

$ /usr/lib/hive/bin/metatool -updateLocation hdfs://hadoop:8020 hdfs://localhost:8020
Run Code Online (Sandbox Code Playgroud)

现在列出的 NameNode 是正确的。

$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://hadoop:8020/user/hive/warehouse
hdfs://hadoop:8020/user/hive/warehouse/test.db
Run Code Online (Sandbox Code Playgroud)