Impala 와 Hive 에는 클라이언트를 대신해 커넥션을 모아 두는 서버 측 풀이 없다. 세션은 클라이언트가 연결을 열 때 만들어지고 닫을 때 사라진다. 따라서 "Impala 에 커넥션 풀이 있느냐" 는 물음의 답은, 풀은 NiFi 의 컨트롤러 서비스가 관리한다 는 것이다.
NiFi 에서 쓰는 컨트롤러 서비스는 대상에 따라 다르다.
| 서비스 | 대상 |
|---|---|
DBCPConnectionPool |
일반 JDBC. Impala JDBC 드라이버도 여기에 등록해 쓴다 |
HiveConnectionPool · Hive3ConnectionPool |
HiveServer2 |
Cloudera 배포본의 ClouderaImpalaConnectionPool · ClouderaHiveConnectionPool |
CDP 에 포함된 전용 풀 |
| 속성 | 의미 | 정할 때 보는 것 |
|---|---|---|
| Max Total Connections | 풀이 가질 수 있는 최대 커넥션 수 | 프로세서의 Concurrent Tasks 합계, 노드 수, DB 쪽 최대 세션 수 |
| Max Wait Time | 커넥션을 빌리기 위해 기다리는 한도 | 너무 짧으면 순간 경합에 바로 실패한다 |
| Min Idle · Max Idle | 유지할 유휴 커넥션 수 | 접속 비용이 크면 Min Idle 을 둔다 |
| Max Connection Lifetime | 커넥션 하나의 최대 수명. 넘으면 폐기하고 새로 연다 | 방화벽·로드밸런서가 유휴 연결을 끊는 환경에서 그 시간보다 짧게 |
| Time Between Eviction Runs | 유휴 커넥션 점검 주기 | 기본은 비활성인 경우가 많다 |
| Validation Query | 빌려 줄 때 던져 보는 쿼리 | Impala·Hive 는 SELECT 1 |
| Soft Min Evictable Idle Time | 유휴로 남길 최소 시간 |
클러스터에서는 노드마다 풀이 따로 있다. 3 노드에서 Max Total Connections 를 20 으로 두면 전체로는 60 개다. DB 쪽 한도와 비교할 때 이 점을 빠뜨리면 안 된다.
끊어진 커넥션을 계속 빌려 주는 문제를 막으려면 Validation Query 를 지정한다. 지정하지 않으면 죽은 커넥션이 그대로 나가 첫 쿼리에서 실패한다. 다만 매번 검증 쿼리를 던지므로 아주 짧은 쿼리를 쓴다.
쿼리 수행 시간을 제한하는 값은 풀이 아니라 프로세서 에 있다. ExecuteSQL · ExecuteSQLRecord 의 Max Wait Time 이 JDBC 쿼리 타임아웃으로 전달된다. 기본값 0 seconds 는 무제한이다. 무제한으로 두면 무거운 쿼리 하나가 커넥션과 스레드를 붙잡아 흐름 전체를 막는다.
ExecuteSQL
Max Wait Time = 300 seconds
서버 쪽에서도 막고 싶으면 Impala 의 쿼리 옵션을 SQL 앞에 함께 보낸다. 다만 프로세서가 여러 문장을 허용하는지 확인해야 한다 (확인 필요).
SET QUERY_TIMEOUT_S=300;
Impala 에는 유휴 세션·유휴 쿼리 제한 옵션(--idle_session_timeout, --idle_query_timeout)이 데몬 기동 옵션으로 있으므로, 관리 화면에서 확인해 두면 NiFi 쪽 값과 어긋나지 않게 맞출 수 있다.