하이브에서 테이블을 DROP 할 때 다음의 오류가 발생하는 경우가 있습니다.
증상
2019-07-29 06:08:02,737 ERROR [c09ac50a-3167-4c79-8909-a678d59ab9a0 uber-SubtaskRunner] hive.ql.exec.DDLTask: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Timeout when executing method: drop_table_with_environment_context; 69853ms exceeds 60000ms) at org.apache.hadoop.hive.ql.metadata.Hive.dropTable(Hive.java:1180) at org.apache.hadoop.hive.ql.metadata.Hive.dropTable(Hive.java:1111) at org.apache.hadoop.hive.ql.exec.DDLTask.dropTable(DDLTask.java:3819) at org.apache.hadoop.hive.ql.exec.DDLTask.dropTableOrPartitions(DDLTask.java:3699) at org.apache.hadoop.hive.ql.exec.DDLTask.execute(DDLTask.java:358) at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:197) at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:100) |
원인
원인은 하이브 메타스토어가 응답이 없어서 발생합니다. 메타스토어가 종료 되어서 발생하는 경우도 있고, 다른 경우는 테이블에 파티션이 많아서 모든 정보를 가져오는 시간이 오래 걸리는 경우 또는 메타스토어가 여러 클라이언트에서 요청을 받아서 다른 처리를 하느라 제대로 응답을 하지 못할 때 발생합니다.
해결방법
1. 클라이언트의 타임아웃 시간을 늘림
먼저 메타스토어가 작업을 처리후 응답하는 것을 기다리는 시간을 늘려주는 방법이 있습니다.
set hive.metastore.client.socket.timeout=120000;
2. 파티션을 먼저 삭제후 테이블을 DROP
ALTER TABLE employee DROP PARTITION (yymmdd='20180510');
3. DROP 작업의 간격을 늘림
작업이 동시에 처리하여 발생한 경우라면 메타스토어가 작업을 처리하는 간격을 늘려줍니다. 파티션이 200~2000개 사이인 테이블을 DROP하는 작업을 동시에 20개 정도 날리면 다음과 같은 GC가 발생합니다. 1분동안 129번의 마이너 GC, 4번의 메이저 GC가 발생하여 메타스토어가 응답을 하지 못하게 됩니다.
다음은 jstat 명령으로 GC를 확인한 결과 입니다. 1초에 한번씩 확인한 결과인데 마이너 GC(YGC) 카운트와 메이저 GC(FGC) 카운트가 급격하게 증가하는 것을 확인할 수 있습니다.
이런경우는 작업간 간격을 늘려주면 문제를 해결할 수 있습니다.