쿼리 프로파일이나 CM 의 질의 상세에서 Waiting on client 로 잡히는 시간은 Impala 가 결과를 준비해 두고 클라이언트가 가져가기를 기다린 시간이다. 서버가 느린 것이 아니라 클라이언트가 늦게 읽는 것이다.
이 시간이 길면 두 가지가 곤란해진다. 결과 버퍼가 코디네이터 메모리를 잡고 있고, 세션이 살아 있는 동안 admission control 슬롯도 점유한다.
fetch 크기가 작다 — 한 번에 가져오는 행 수가 적으면 왕복이 늘어난다. JDBC 는 setFetchSize, ODBC 는 RowsFetchedPerBlock 을 키운다.
stmt.setFetchSize(10000);
클라이언트가 행마다 처리한다 — 받아서 바로 가공·적재하는 코드는 그만큼 서버를 붙잡는다. 결과를 먼저 다 받아 두고 처리하거나, 가공을 SQL 쪽으로 옮긴다.
결과 집합이 지나치게 크다 — 수백만 행을 클라이언트로 끌어오는 설계 자체를 의심한다. 집계를 Impala 에서 끝내거나, 결과를 테이블로 써 두고(CREATE TABLE AS SELECT) 필요한 만큼만 읽는다.
BI 도구의 미리보기 — 화면에 100행만 보여 주면서 커서를 열어 두는 도구가 있다. 도구 쪽 행 제한과 커서 정책을 확인한다.
클라이언트가 결과를 끝까지 읽지 않고 사라지면 세션이 남는다. impalad 플래그로 정리 기준을 둔다.
--idle_query_timeout=600
--idle_session_timeout=3600
idle_query_timeout 은 결과를 가져가지 않는 질의를 정리하고, idle_session_timeout 은 유휴 세션을 닫는다. 기본값은 둘 다 0(무제한)이므로, 공용 클러스터라면 값을 넣어 두는 편이 안전하다. 다만 오래 걸리는 배치 세션이 함께 끊기지 않도록 여유를 둔다.