impala.dbapi.connect() 에 user 를 주지 않으면 cursor() 를 호출하는 시점에 getpass.getuser() 로 OS 사용자명을 가져와 세션을 연다. getpass.getuser() 는 환경변수 LOGNAME → USER → LNAME → USERNAME 순으로 보고, 모두 없으면 /etc/passwd 를 본다. SELECT USER(); · SELECT effective_user(); 로 실제 세션 사용자를 확인한다.
| auth_mechanism | user 생략 시 |
|---|---|
| NOSASL | OS 사용자명으로 인증 없이 접속 |
| PLAIN / LDAP | OS 사용자명, password 도 없으면 빈 문자열 → 실패 |
| GSSAPI | Kerberos 티켓(kinit)으로 인증. user 값은 표시용 |
현재 세션 ID 는 impala-shell 의 PROFILE; 출력 Session ID: 나 Impala 웹 UI(25000 포트) /sessions 에서 본다.
impyla 는 연결 하나가 TCP 소켓 하나이고, 그 위에 HiveServer2 세션이 열린다. 풀을 만들 때 세션 3 개를 유지하려면 연결 3 개를 만든다. 유휴 세션은 Impala 의 --idle_session_timeout 에 걸려 끊기므로, 오래 유지하려면 주기적으로 가벼운 쿼리(SELECT 1)를 보내거나 소켓 keepalive 를 켠다. 풀에서 꺼낼 때 pop from empty list 가 나면 반납 경로가 빠진 것이므로 try/finally 로 반드시 되돌린다.
sudo tcpdump -i eth0 -n -tttt -v 'tcp and host <impala_host> and port 21050 and tcp[tcpflags] == tcp-ack and (ip[2:2] - ((ip[0]&0xf)<<2) - ((tcp[12]&0xf0)>>2)) == 0'
keepalive probe 는 길이 0 의 ACK 이고 seq 가 last_seq - 1 이다. Wireshark 필터는 tcp.analysis.keep_alive or tcp.analysis.keep_alive_ack 다. 커널 기본값은 net.ipv4.tcp_keepalive_time=7200 이라 소켓에 TCP_KEEPIDLE · TCP_KEEPINTVL · TCP_KEEPCNT 를 직접 설정해야 짧은 주기로 나간다.
TTransportException: Connection reset 은 유휴 타임아웃 · 로드밸런서의 idle timeout · 코디네이터 재시작이 원인이다. 풀에서 꺼낸 연결로 SELECT 1 을 먼저 보내 살아 있는지 확인하고, 실패하면 새로 연결하는 검증 단계를 둔다.