복붙노트

[HADOOP] core-site.xml에서 fs.default.name / fs.defaultFS 값을 완전히 존중하지 않는 하이브

HADOOP

core-site.xml에서 fs.default.name / fs.defaultFS 값을 완전히 존중하지 않는 하이브

hadoop이라는 컴퓨터에 NameNode 서비스가 설치되어 있습니다.

core-site.xml 파일에는 fs.defaultFS (fs.default.name과 동일)가 다음과 같이 설정되어 있습니다.

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop:8020</value>
</property>

HDFS의 하이브 서버에 현재 존재하는 test_table이라는 매우 간단한 테이블이 있습니다. 즉, / user / hive / warehouse / test_table 아래에 저장됩니다. 하이브에서 아주 간단한 명령을 사용하여 만들어졌습니다 :

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 주소를 사용하도록하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.나는 Hive metastore가 각 테이블의 위치를 ​​추적한다는 것을 알았습니다. 하이브 콘솔에서 그 위치가 다음과 같이 실행되는 것을 볼 수 있습니다.

    나는 Hive metastore가 각 테이블의 위치를 ​​추적한다는 것을 알았습니다. 하이브 콘솔에서 그 위치가 다음과 같이 실행되는 것을 볼 수 있습니다.

    hive> DESCRIBE EXTENDED test_table;
    

    따라서 metastore 서비스가 실행되는 동안 core-site.xml의 NameNode가 변경된 경우이 문제가 발생합니다. 따라서이 문제를 해결하려면 해당 컴퓨터에서 서비스를 다시 시작해야합니다.

    $ sudo service hive-metastore restart
    

    그런 다음 metastore는 새로 생성 된 테이블에 대해 새 fs.defaultFS를 사용합니다.

    다음 명령 세트를 실행하여 이미 존재하는 테이블의 위치를 ​​정정 할 수 있습니다. 하이브 메타 스토어를 구성하여 고 가용성을 사용하도록 Cloudera 설명서에서 가져 왔습니다.

    $ /usr/lib/hive/bin/metatool -listFSRoot
    ...
    Listing FS Roots..
    hdfs://localhost:8020/user/hive/warehouse
    hdfs://localhost:8020/user/hive/warehouse/test.db
    

    NameNode 위치 수정 :

    $ /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
    
  2. from https://stackoverflow.com/questions/19431074/hive-not-fully-honoring-fs-default-name-fs-defaultfs-value-in-core-site-xml by cc-by-sa and MIT license