Impala 또는 Hive 에 Cloudera 드라이버로 접속할 때 다음 메시지가 나온다.
[Cloudera][DriverSupport] (1110) Unexpected response received from server.
Please ensure the server host and port specified for the connection are correct
and confirm if SSL should be enabled for the connection.
메시지 그대로 드라이버가 기대한 프로토콜과 서버가 실제로 말하는 프로토콜이 어긋난 것이다. 자격 증명이나 권한 문제가 아니라 연결 계층의 불일치이며, 실무에서는 다음 세 가지가 대부분이다.
첫째, 평문으로 접속했는데 서버가 TLS 를 요구하거나 그 반대인 경우다. TLS 로 감싼 응답을 평문으로 해석하면 바로 이 오류가 난다.
둘째, 전송 방식이 다른 포트에 붙은 경우다. Impala 는 바이너리 전송과 HTTP 전송이 서로 다른 포트에서 동작하고, HTTP 전송은 경로(httpPath)까지 맞아야 한다.
셋째, 드라이버가 실제로는 로드밸런서나 리버스 프록시에 붙어 있고 그쪽이 HTTP 오류 페이지를 돌려주는 경우다. 이때 응답 본문은 SQL 프로토콜이 아니므로 같은 오류로 표시된다.
| 대상 | 기본 포트 | 비고 |
|---|---|---|
| Impala — HiveServer2 바이너리 | 21050 | ODBC · JDBC 기본 경로 |
| Impala — HiveServer2 HTTP | 28000 | transportMode=http 일 때 |
| Impala — Beeswax (레거시) | 21000 | impala-shell 기본 |
| HiveServer2 — 바이너리 | 10000 | TLS 를 켜도 포트는 그대로다 |
| HiveServer2 — HTTP | 10001 | transportMode=http;httpPath=cliservice |
| HiveServer2 — 웹 UI | 10002 | 접속용 포트가 아니다 |
HiveServer2 에 TLS 를 켜면 10002 로 옮겨 간다는 설명이 돌아다니지만 사실이 아니다. 10002 는 HiveServer2 의 웹 UI 이며, TLS 적용 여부와 상관없이 접속 포트는 바뀌지 않는다.
Cloudera Data Warehouse 의 Virtual Warehouse 는 계열이 다르다. 게이트웨이를 통해 443 포트 · HTTPS · HTTP 전송으로 접속하며 접속 문자열을 UI 의 JDBC/ODBC 복사 기능에서 그대로 받아 쓰는 것이 원칙이다. Base 클러스터 기준으로 21050 을 적어 넣으면 이 오류가 난다.
nc -zv <host> 21050
openssl s_client -connect <host>:21050 -servername <host> </dev/null
인증서 정보가 나오면 TLS 이므로 드라이버에서도 SSL 을 켜야 하고, 곧바로 끊기면 평문이므로 SSL 을 꺼야 한다.
ODBC DSN 의 LogLevel 과 LogPath 를 설정해 드라이버가 받은 응답을 직접 확인하면 프록시의 HTTP 오류 페이지인지 프로토콜 불일치인지 바로 갈린다.
인증 방식(AuthMech)은 서버 설정에 맞춰야 하며 임의로 골라도 되는 값이 아니다.
| AuthMech | 의미 | 서버 조건 |
|---|---|---|
| 0 | 인증 없음 | 인증이 꺼진 환경 |
| 1 | Kerberos | 클러스터가 Kerberos 로 보호된 경우, 사전 kinit 필요 |
| 2 | 사용자 이름만 | 인증 없이 사용자만 전달 |
| 3 | 사용자 이름과 암호 | LDAP 인증 |
Kerberos 예시다.
[ImpalaDSN]
Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so
HOST=<impala-host>
PORT=21050
AuthMech=1
KrbRealm=<REALM>
KrbFQDN=<impala-host>
KrbServiceName=impala
LDAP 예시다. LDAP 인증은 평문 전송이므로 TLS 를 함께 켠다.
[ImpalaDSN]
Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so
HOST=<impala-host>
PORT=21050
AuthMech=3
UID=<ldap_user>
PWD=${PASSWORD}
SSL=1
TrustedCerts=/etc/pki/tls/certs/ca-bundle.crt
리눅스에서는 odbcinst.ini 에 드라이버 항목이 등록돼 있어야 하며, 연결 확인은 isql -v ImpalaDSN 으로 한다.
isql 또는 드라이버의 Test 버튼에서 연결이 성립하고 간단한 질의가 반환되는지 확인한다. 인증 오류(Invalid credentials)로 메시지가 바뀌면 연결 계층은 해결된 것이고 남은 것은 인증 설정이다.