티스토리 뷰

반응형

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 데몬으로 인증을 주기적으로 갱신하고 있는지 확인해 보고 환경변수도 체크해보자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함