티스토리 뷰
keberos 인증 기반의 hive 에서 맵핑을 삽질을 워낙 많이 해서 정리하고자 한다.
우선 airflow 의 connection 정보에 다음과 같이 정보 Hive Metastore Thrift 정보가 아래와 같이 입력했다고 가정한다.
(참고로 테스트한 airflow 는 2.5.3 기반이었고, python 3.x 버전을 사용했다)
사실 NamedHivePartitionSensor 를 사용하기 위한 용도였고, 이때 필요한 연결이 Hive Metastore Thrift 정보였다.
테스트 방법
dag 를 만들어서 테스트하는것은 연결이 안될때 삽질하기 매우 어렵다.
그래서 NamedHivePartitionSensor 에서 사용하는 코드를 다음과 같이 직접 선언해서 정보를 가져오면 된다.
(물론 AIRFLOW_HOME 이 세팅된 환경의 python 에서 실행해야 한다)
from airflow.providers.apache.hive.hooks.hive import HiveMetastoreHook
meta = HiveMetastoreHook(metastore_conn_id='metastore_default')
schema = 'sample_db'
tbl_name = 'sample_table'
partition = "ymd='2023-07-18' and hh24='13'"
meta.check_for_partition(schema=schema, table=tbl_name, partition=partition)
사례1. no mechanism available: No worthy mechs found' 오류
cyrus-sasl 모듈이 없으면 아래와 같은 오류가 발생한다. 해결방법은 해당 모듈을 설치하면 동작된다.
설치 방법은 아래와 같이 yum 을 통해 설치하면 해당 오류는 해결된다. (centos 기준)
sudo yum install cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-lib cyrus-sasl-plain -y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/providers/apache/hive/hooks/hive.py", line 599, in check_for_partition
with self.metastore as client:
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/hmsclient.py", line 72, in __enter__
self.open()
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/hmsclient.py", line 67, in open
self._oprot.trans.open()
File "/home/airflow/py3/lib/python3.9/site-packages/thrift_sasl/__init__.py", line 84, in open
raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found'
사례2 : TSocket read 0 bytes
airflow.cfg 의 [core] 정보의 security 정보가 누락되어있을때 나타나는 에러다.
[kerberos] 탭의 정보이회에 [core] 탭의 security 정보를 누락하지 말자.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/providers/apache/hive/hooks/hive.py", line 600, in check_for_partition
partitions = client.get_partitions_by_filter(
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/genthrift/hive_metastore/ThriftHiveMetastore.py", line 3611, in get_partitions_by_filter
return self.recv_get_partitions_by_filter()
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/genthrift/hive_metastore/ThriftHiveMetastore.py", line 3626, in recv_get_partitions_by_filter
(fname, mtype, rseqid) = iprot.readMessageBegin()
File "/home/airflow/py3/lib/python3.9/site-packages/thrift/protocol/TBinaryProtocol.py", line 148, in readMessageBegin
name = self.trans.readAll(sz)
File "/home/airflow/py3/lib/python3.9/site-packages/thrift/transport/TTransport.py", line 62, in readAll
chunk = self.read(sz - have)
File "/home/airflow/py3/lib/python3.9/site-packages/thrift/transport/TTransport.py", line 164, in read
self.__rbuf = BufferIO(self.__trans.read(max(sz, self.__rbuf_size)))
File "/home/airflow/py3/lib/python3.9/site-packages/thrift/transport/TSocket.py", line 166, in read
raise TTransportException(type=TTransportException.END_OF_FILE,
thrift.transport.TTransport.TTransportException: TSocket read 0 bytes
HiveMetastoreHook 코드의 get_metastore_client() 함수를 보면, 해당 설정 조건에 따라 분기가 달라지기 때문에 해당 설정도 영향을 주게 된다. 주의하도록 하자.
https://github.com/apache/airflow/blob/main/airflow/providers/apache/hive/hooks/hive.py#L543-L568
사례3. No Kerberos credentials available 오류
아래와 같은 오류가 발생했다면, kerberos 인증이 안된 상태로 호출되었기 때문이다.
kerberos 인증을 할때 kinit 명령어를 사용해야 하는데, 이때 KRB5_CONFIG 혹은 KRB5CCNAME 를 변경후 kinit 을 해줘야할 수 있는데 이런 상황이라면 환경변수 지정후 kinit 명령을 실행후 호출해보자.
이때 airflow.cfg 에 존재하는 ccache 설정값이 KRB5CCNAME 와 맵핑되어야 하는것을 참고하자.
Traceback (most recent call last):
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/sensors/base.py", line 199, in execute
poke_return = self.poke(context)
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/providers/apache/hive/sensors/named_hive_partition.py", line 103, in poke
if not self.poke_partition(self.partition_names[self.next_index_to_poke]):
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/providers/apache/hive/sensors/named_hive_partition.py", line 95, in poke_partition
return self.hook.check_for_named_partition(schema, table, partition)
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/providers/apache/hive/hooks/hive.py", line 621, in check_for_named_partition
with self.metastore as client:
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/hmsclient.py", line 72, in __enter__
self.open()
File "/home/airflow/py3/lib/python3.9/site-packages/hmsclient/hmsclient.py", line 67, in open
self._oprot.trans.open()
File "/home/airflow/py3/lib/python3.9/site-packages/thrift_sasl/__init__.py", line 84, in open
raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (No Kerberos credentials available (default cache: /tmp/airflow_cccache))'
즉, 아래와 같이 kinit 명령을 실행후 테스트하면 동작됨을 확인할 수 있고, 이는 kerberos 인증 티켓이 없거나 못찾는 문제다.
참고로 airflow kerberos 데몬으로 인증을 주기적으로 갱신하고 있는지 확인해 보고 환경변수도 체크해보자.