Java 클라이언트를 쓸 수 없는 환경(파이썬, 외부 애플리케이션)에서 HBase 에 접근하려면 Thrift 게이트웨이를 쓴다. 접속이 되는지 빠르게 확인하는 방법과, 흔히 겪는 프로토콜 오해를 정리한다.
hbase thrift start
hbase thrift2 start
| 인터페이스 | 기본 포트 | 특징 |
|---|---|---|
| Thrift 1 | 9090 | happybase 등 기존 클라이언트가 사용 |
| Thrift 1 info UI | 9095 | 상태 확인용 HTTP |
| Thrift 2 | 9090(별도 기동 시 충돌 주의) | HBase 2.x API 에 가까운 IDL |
| REST(Stargate) | 8080 | HTTP 로 접근할 때 사용 |
Thrift 포트는 HTTP 가 아니라 바이너리 프로토콜이다. curl 이나 브라우저로 접근하면 No protocol version header 같은 오류가 난다. HTTP 로 다루고 싶으면 Thrift 대신 REST 서버를 띄운다. Thrift 서버를 HTTP 모드로 띄우는 옵션(-h / hbase.regionserver.thrift.http)도 있으나, 클라이언트도 HTTP 전송을 쓰도록 맞춰야 한다.
pip install happybase
import happybase
conn = happybase.Connection(host='thrift-host', port=9090, timeout=10000)
conn.open()
print(conn.tables())
table = conn.table('user')
print(table.row(b'user001'))
for key, data in table.scan(limit=5):
print(key, data)
conn.close()
happybase 는 Thrift 1 바이너리 프로토콜을 쓴다. 서버를 framed 전송이나 compact 프로토콜로 띄웠다면 클라이언트에도 같은 설정을 줘야 한다.
conn = happybase.Connection(
host='thrift-host', port=9090,
transport='framed', protocol='compact')
포트가 열려 있는지와 프로세스가 살아 있는지 정도는 다음으로 본다.
nc -vz thrift-host 9090
curl -s http://thrift-host:9095/ | head
curl -s http://rest-host:8080/ | head
Thrift IDL 로 직접 클라이언트를 만들려면 Hbase.thrift 를 받아 컴파일한다.
wget https://raw.githubusercontent.com/apache/hbase/master/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
thrift --gen py Hbase.thrift
thrift --gen java Hbase.thrift
생성된 gen-py 디렉터리를 sys.path 에 넣지 않으면 NameError: name 'Hbase' is not defined 가 난다.
Thrift 게이트웨이는 단일 지점이다. 트래픽이 몰리면 게이트웨이 자체가 병목이 되므로, 앞단에 로드밸런서를 두고 여러 대를 띄운다. Kerberos 환경에서는 Thrift 서버가 대리 인증(impersonation)을 하도록 hbase.thrift.security.qop 과 proxyuser 설정을 맞춰야 한다.