린아저씨의 잡학사전

Hive와 Impala를 함께 사용하다 보면 Hive에서 만든 데이터베이스와 테이블을 Impala에서 사용하는 경우가 자주 발생하게 됩니다. 이때 아주 사소하면서도 자주 볼 수 있는 에러가 있습니다.

 

 

1. 에러 메시지

ERROR : AnalysisException : Could not resolve table reference : 'test_db.test_table'
Cloud not execute command : SELECT * FROM test_db.test_table

 

2. 원인

Impala에서 Meta data를 갱신해주지 않아, Hive에서 생성한 데이터베이스와 테이블을 조회하지 못하여 발생한 에러 입니다. 그럴 경우 위와 같이 해당 데이터베이스와 테이블이 존재하지 않는다는 에러 메시지를 확인할 수 있습니다.

 

3. 조치

1) 모든 테이블의 메타데이터를 갱신

> invalidate metadata;

or

> invalidate metadata [Table name];

첫번째로 invalidate metadata; 명령어를 사용하는 것입니다. invalidate metadata는 Hive Metastore에 있는 테이블에 대한 모든 메타 데이터를 다시 로드하는 명령어 입니다. invalidate metadata의 경우에는 모든 데이터를 다시 불러오는 작업이기 때문에 리소스가 많이 드는 작업이 될 수 있기 때문에, 테이블이나 파티션이 많은 경우에는 가급적 사용하지 않도록 해야 합니다.

 

invalidate metadata; 와 같이 테이블 이름을 써주지 않으면 모든 테이블의 메타 데이터를 갱신하게 되고, invalidate metatdata [Table name]과 같이 새롭게 추가할 테이블 이름을 매개변수로 넣어주면 해당 테이블의 메타 데이터만 갱신하게 됩니다.

 

2) 이미 추가되어 있는 테이블에 대한 메타데이터 갱신

> refresh [table name];

refresh 명령어를 통해서도 메타데이터를 갱신해 줄 수 있습니다. invalidate metadata 명령어와 다른 점은 refresh는 새로 추가된 테이블 정보에 대해서만 메타 데이터를 로드하기 때문에 비교적 적은 리소스로 메타 데이터를 갱신할 수 있습니다. 

 

refresh 명령어는 invalidate metadata와는 다르게 반드시 테이블 이름을 매개변수로 넣어주어야 합니다. 그렇기 때문에 이미 갱신되어 있지 않은 새로 만든 테이블에 대해서는 refresh를 통해 메타 데이터를 갱신할 수 없습니다. 새롭게 생성한 테이블은 반드시 invalidate metadata를 통해 메타 데이터를 갱신해 주어야 이후 테이블에 대해 추가 변경 사항을 refresh 명령어로 갱신할 수 있습니다.

 

 

참고 : Apache Impala - impala invalidate metadata

공유하기

facebook twitter kakaoTalk kakaostory naver band