빅데이터 플랫폼을 운영하면서 겪었던 문제 중 Hive 관련 경험을 소개하도록 하겠습니다.
문제 상황 & 분석 과정
클러스터 운영 중에 Hive Query가 작동하지 않는다는 문의를 받았습니다. 문의 사항은 너무 일반적인 문제 상황이었기 때문에 현재 상황을 파악했고 아래와 같았습니다.
- Hiveserver 정상
- Terminal CLI에서 Hive 접속 가능
- Hive Metastore 정상
Hive 상태를 체크했지만 겉으로 보기에는 전혀 문제가 있어보이지 않았습니다. 그래서 일단 Hive에 접속해 간단한 select문을 실행해봤습니다.
[root@server1 ~]# hive
....
hive > select * from example_db.example_table;
하지만 Query를 실행한지 한참이 되었지만 아무런 결과를 받을 수 없습니다. 그래서 현재 Application이 돌고 있는 상황을 체크했고 아래와 같았습니다.
- YARN UI에 해당 Hive 작업 Application 존재.
- AM( Application Master )는 할당된 상태.
- Application의 상태는 Running.
- Application에 할당된 리소스는 거의 없음.
- Running 상태지만 실제 작업은 돌고 있지 않은 것으로 추정.
다음으로는 Hive 로그를 확인했습니다. Hive 로그가 저장되는 경로(/var/log/hive)에 가면 hiveserver2.log와 hivemetastore.log가 존재합니다. 두 로그를 확인했을 때 대략적인 단서는 아래와 같았습니다.
- hiveserver2.log 에서 Hive Metastore의 connection이 지속해서 연결 및 실패를 반복
- hivemetastore.log에서 "Transaction failed to commit" 발견
- Error에 대해 1차적으로 Hive Metastore 관련 문제 발생
- Error에 대해 마지막으로 MySQL 관련 문제 발생
- MySQL lock에 대한 문제 발생
Hive 자체에 문제가 있을 것으로 예상했지만 위와 같은 과정들을 통해 Hive Metastore에 문제가 있다는 것을 알게 되었고 최종적으로 MySQL의 lock도 해당 문제와 관련이 있다는 것을 알 수 있었습니다. 아래 로그는 hivemetastore.log에서 볼 수 있었던 로그입니다.
hivemetastore.log |
server.TThreadPoolServer (TThreadPoolServer.java:run(297)) - Error occurred during processing of message. java.lang.RuntimeException: javax.jdo.JDODataStoreException: Transaction failed to commit NesttedThrowables: org.datanucleus.exceptions.NucleusDataStoreExceptionL Exception thrown flushing changes to datastore at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.refresh_privileges(HiveMetaStore.java:6666) .... Caused by: javax.jdo.JDODataStoreException: Transaction failed to commit .... Caused by: org.datanucleus.exceptions.NucleusDataStoreException: Exception thrown flushing changes to datastore .... Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction .... Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) .... |
위의 로그를 분석했을 때 Hive Query를 실행하기 위해 Hive Metastore를 거치게 되는데, 해당 RDB인 MySQL가 lock이 걸려있는 상태로 인해 정상적인 접근이 불가능했고 이는 곧 Hive Query 실행이 안 되는 결과를 발생시켰다고 결론지었습니다.
해결 방법
본 문제를 해결하기 위한 방법은 문제를 분석했던 과정에 비해 상당히 간단했습니다. Hive Metastore로 사용했던 MySQL을 재시작 함으로써 발생했던 문제는 해결이 되었습니다. 하지만 저의 경우 MySQL의 다운으로 인한 위험성을 사전에 준비하지 않고 재시작을 했습니다. 이는 큰 Side effect를 발생시킬 수 있으므로, 사전 작업을 미리 할 것을 권고드립니다.
MySQL 재시작을 통해 lock 문제를 해결하여 Hive를 다시 정상적으로 실행시킬 수 있었지만, MySQL의 lock으로 인해 Hive가 어떤 원인으로 Metastore가 정상적으로 작동하지 않았는지 정확하게 분석하진 못했습니다. Hive Query 실행 과정에서 Metastore가 어떤 과정을 거치고 작동하는지 상세하게 공부할 필요성을 느꼈습니다.
'Hadoop Ecosystem > Hive' 카테고리의 다른 글
[Hive] IntelliJ로 Runtime Debugging하기 (0) | 2022.11.12 |
---|---|
[Hive] limit 사용 시 leastNumRows 에러 발생 이슈 (0) | 2022.11.04 |
[Hive] Metastore의 heap memory 증가 이슈 해결 과정 (2) | 2022.07.18 |
[Hive] Hive 아키텍처와 HiveServer2 & Hive Metastore (0) | 2022.07.01 |
[Hive] Unable to fetch table .null 에러 해결 방법 (0) | 2022.05.30 |