我在一台名为hadoop
的机器上安装了NameNode服务。
core-site.xml
文件将fs.defaultFS
(相当于 fs.default.name
)设置为以下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop:8020</value>
</property>
我有一个名为test_table
的非常简单的表,目前存在于HDFS上的Hive服务器中。也就是说,它存储在 /user/hive/warehouse/test_table
.它是使用 Hive 中一个非常简单的命令创建的:
CREATE TABLE new_table (record_id INT);
如果我尝试在本地将数据加载到表中(即使用 LOAD DATA LOCAL
),一切都按预期进行。但是,如果数据存储在 HDFS 上,并且我想从那里加载,则会出现问题。
我运行一个非常简单的查询来尝试此加载:
hive> LOAD DATA INPATH '/user/haduser/test_table.csv' INTO TABLE test_table;
这样做会导致以下错误:
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.
正如错误所述,它正在尝试从hdfs://hadoop:8020/user/haduser/test_table.csv
移动到hdfs://localhost:8020/user/hive/warehouse/test_table
。第一个路径是正确的,因为它引用hadoop:8020
;第二条路径不正确,因为它引用了localhost:8020
。
core-site.xml
文件明确指出要使用hdfs://hadoop:8020
。hive-site.xml
中的hive.metastore.warehouse
值正确指向 /user/hive/warehouse
。因此,我怀疑此错误消息是否有任何真正的价值。
如何让 Hive 服务器在创建表时使用正确的 NameNode 地址?
我发现Hive元存储跟踪每个表的位置。可以看到该位置在 Hive 控制台中运行如下。
hive> DESCRIBE EXTENDED test_table;
因此,如果在元存储服务仍在运行时更改了 core-site.xml
中的 NameNode,则会出现此问题。因此,若要解决此问题,应在该计算机上重新启动服务:
$ sudo service hive-metastore restart
然后,元存储将对新创建的表使用新fs.defaultFS
。
现有表
可以通过运行以下一组命令来更正已存在的表的位置。这些是从 Cloudera 文档中获取的,用于将 Hive 元存储配置为使用高可用性。
$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://localhost:8020/user/hive/warehouse
hdfs://localhost:8020/user/hive/warehouse/test.db
更正名称节点位置:
$ /usr/lib/hive/bin/metatool -updateLocation hdfs://hadoop:8020 hdfs://localhost:8020
现在列出的 NameNode 是正确的。
$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://hadoop:8020/user/hive/warehouse
hdfs://hadoop:8020/user/hive/warehouse/test.db