hadoop - español - cloudera quickstart
Hive no cumple el valor de fs.default.name/fs.defaultFS en core-site.xml (1)
Tengo el servicio NameNode instalado en una máquina llamada hadoop
.
El archivo core-site.xml
tiene el fs.defaultFS
(equivalente a fs.default.name
) configurado para lo siguiente:
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop:8020</value>
</property>
Tengo una tabla muy simple llamada test_table
que actualmente existe en el servidor de Hive en el HDFS. Es decir, está almacenado en /user/hive/warehouse/test_table
. Fue creado usando un comando muy simple en Hive:
CREATE TABLE new_table (record_id INT);
Si intento cargar datos en la tabla localmente (es decir, usando LOAD DATA LOCAL
), todo se desarrolla como se espera. Sin embargo, si los datos se almacenan en el HDFS y deseo cargarlos desde allí, se produce un problema.
Ejecuto una consulta muy simple para intentar esta carga:
hive> LOAD DATA INPATH ''/user/haduser/test_table.csv'' INTO TABLE test_table;
Hacerlo conduce al siguiente error:
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.
Como indica el error, está intentando pasar de hdfs://hadoop:8020/user/haduser/test_table.csv
a hdfs://localhost:8020/user/hive/warehouse/test_table
. La primera ruta es correcta porque hace referencia a hadoop:8020
; la segunda ruta es incorrecta, porque hace referencia a localhost:8020
.
El archivo core-site.xml
indica claramente usar hdfs://hadoop:8020
. El valor de hive.metastore.warehouse
en hive-site.xml
apunta correctamente a /user/hive/warehouse
. Por lo tanto, dudo que este mensaje de error tenga algún valor verdadero.
¿Cómo puedo hacer que el servidor Hive use la dirección correcta NameNode al crear tablas?
Descubrí que el metastore de Hive rastrea la ubicación de cada tabla. Puede ver que esa ubicación se está ejecutando lo siguiente en la consola de Hive.
hive> DESCRIBE EXTENDED test_table;
Por lo tanto, este problema se produce si el NameNode en core-site.xml
se modificó mientras el servicio metastore aún se estaba ejecutando. Por lo tanto, para resolver este problema, el servicio debe reiniciarse en esa máquina:
$ sudo service hive-metastore restart
Entonces, el metastore usará el nuevo fs.defaultFS
para las tablas recién creadas.
Tablas ya existentes
La ubicación de las tablas que ya existen se puede corregir ejecutando el siguiente conjunto de comandos. Estos se obtuvieron de la documentación de Cloudera para configurar Hive metastore para usar High-Availability.
$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://localhost:8020/user/hive/warehouse
hdfs://localhost:8020/user/hive/warehouse/test.db
Corregir la ubicación de NameNode:
$ /usr/lib/hive/bin/metatool -updateLocation hdfs://hadoop:8020 hdfs://localhost:8020
Ahora el NameNode listado es correcto.
$ /usr/lib/hive/bin/metatool -listFSRoot
...
Listing FS Roots..
hdfs://hadoop:8020/user/hive/warehouse
hdfs://hadoop:8020/user/hive/warehouse/test.db