접속 URL 을 매번 길게 치는 것이 번거롭다. Beeline 에도 설정 파일이 있는지, 클러스터에 이미 깔린 Beeline 은 어디에서 왔는지 확인이 필요하다.
Beeline 은 HiveServer2 에 붙는 JDBC 클라이언트다. 설정이 하나로 모여 있지 않고 다음 셋으로 나뉜다.
| 파일 | 위치 | 역할 |
|---|---|---|
beeline-hs2-connection.xml |
$HIVE_CONF_DIR 또는 ~/.beeline/ |
접속 URL 을 조립해 줘 beeline 만 쳐도 붙게 한다 |
beeline.properties |
~/.beeline/beeline.properties |
출력 형식·색상 같은 셸 동작 |
hive-site.xml |
$HIVE_CONF_DIR |
Hive 설정 전반. 클라이언트 쪽은 일부만 쓰인다 |
이 파일이 있으면 beeline 을 인자 없이 쳐도 접속된다. 값들이 조립돼 JDBC URL 이 된다.
<configuration>
<property>
<name>beeline.hs2.connection.user</name>
<value>hive</value>
</property>
<property>
<name>beeline.hs2.connection.hosts</name>
<value>hs2.example.local:10000</value>
</property>
<property>
<name>beeline.hs2.connection.hiveconf</name>
<value>hive.cli.print.current.db=true</value>
</property>
<property>
<name>beeline.hs2.connection.principal</name>
<value>hive/_HOST@EXAMPLE.COM</value>
</property>
</configuration>
찾는 순서는 $HIVE_CONF_DIR, $HIVE_HOME/conf, 사용자 홈의 .beeline/ 이다. 명령줄에 -u 를 주면 이 파일은 무시된다.
출력 모양을 고정한다. 결과를 파일로 내려 후속 처리할 때 특히 유용하다.
beeline.outputformat=csv2
beeline.showHeader=true
beeline.color=false
beeline.silent=true
설정 파일을 쓰지 않는다면 URL 을 직접 준다.
# 단순 인증
beeline -u "jdbc:hive2://hs2.example.local:10000/default" -n appuser
# 커버로스
kinit -kt /etc/security/keytabs/app.keytab app@EXAMPLE.COM
beeline -u "jdbc:hive2://hs2.example.local:10000/default;principal=hive/_HOST@EXAMPLE.COM"
# ZooKeeper 디스커버리 (HA)
beeline -u "jdbc:hive2://zk1:2181,zk2:2181,zk3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"
_HOST 는 클라이언트가 실제 접속 호스트 이름으로 치환한다. 로드밸런서를 거치면 치환 결과가 LB 의 FQDN 이 되므로, 그 주체가 keytab 에 있어야 한다.
비밀번호는 명령줄에 적지 않는다. 명령 이력과 프로세스 목록에 남는다. -p 를 생략하면 대화형으로 묻는다.
커버로스 티켓 캐시에는 내가 받은 티켓만 들어 있다. kinit 으로 받은 TGT 와, 그 뒤 실제로 접속하면서 발급된 서비스 티켓이다. Hive 에 아직 붙지 않았다면 hive/... 서비스 티켓은 없는 것이 정상이다.
붙은 뒤 다시 보면 나타난다.
klist
# Valid starting Expires Service principal
# ... ... krbtgt/EXAMPLE.COM@EXAMPLE.COM
# ... ... hive/hs2.example.local@EXAMPLE.COM
Impala 는 보이는데 Hive 는 안 보인다면, 그 세션에서 Impala 에만 붙었던 것이다. 권한 문제가 아니다.
Beeline 은 Hive 배포본에 포함돼 있으므로 독립 설치 대상이 아니다. 어디에서 왔는지 확인한다.
which beeline
readlink -f "$(which beeline)"
env | grep -E 'HIVE_HOME|HIVE_CONF_DIR|HADOOP_CONF_DIR'
Cloudera 배포판이면 parcel 아래에 있고, tar 파일은 애초에 존재하지 않는다. parcel 은 압축 해제된 형태로 배포된다.
ls -d /opt/cloudera/parcels/CDH/lib/hive
ls /opt/cloudera/parcels/CDH/bin/beeline
rpm -qf "$(readlink -f "$(which beeline)")" 2>/dev/null
alternatives 를 거치는 경우도 많으므로 readlink -f 로 최종 경로를 본다.
클러스터 밖 장비에 클라이언트만 두고 싶다면 Hive 배포본을 풀어 쓴다. 자바가 먼저 있어야 한다.
tar -xzf apache-hive-<버전>-bin.tar.gz -C /opt
export HIVE_HOME=/opt/apache-hive-<버전>-bin
export PATH=$HIVE_HOME/bin:$PATH
export HADOOP_CONF_DIR=/etc/hadoop/conf
HADOOP_CONF_DIR 이 필요한 이유는 Beeline 이 커버로스 설정과 HDFS 관련 설정을 그쪽에서 읽기 때문이다. 이것이 없으면 커버로스 클러스터에서 인증에 실패한다.
서버와 클라이언트의 Hive 주 버전은 맞추는 것이 안전하다. 크게 차이 나면 일부 명령이 동작하지 않는다.
beeline -e 로 한 줄 질의를 던질 때 셸 인용에 주의한다. 작은따옴표 안의 값이 셸에 먹히면 엉뚱한 질의가 간다.
!quit 대신 Ctrl-C 로 빠져나오면 세션이 서버에 남는 경우가 있다.
_HOST 치환과 주체 불일치.