Spark on Livy - NoSuchObjectException (Ranger Authorization)

2021. 12. 7. 23:53Bigdata Platform/Spark

우리 팀은 Livy를 활용하여 Spark SQL을 이용한 배치 솔루션을 운용중이다.

 

이번에 플랫폼 이관을 하면서 솔루션을 테스트하는 중이였는데, 솔루션 개발팀쪽에서 에러가 발생한다고 질의가 들어왔다.

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: NoSuchObjectException(message:Table inf_tb_01 does not exist)
  at org.apache.hadoop.hive.ql.metadata.Hive.getPartitions(Hive.java:3796)
  at org.apache.hadoop.hive.ql.metadata.Hive.getPartitions(Hive.java:3819)
  at org.apache.spark.sql.hive.client.HiveClientImpl$$snonfun$dropPartitions$1$$anonfun$20.apply(HiveClientImpl.scala:672)
  at org.apache.spark.sql.hive.client.HiveClientImpl$$snonfun$dropPartitions$1$$anonfun$20.apply(HiveClientImpl.scala:667)
  ....

 

이상하게도 spark shell로 접속해서 table에 질의하였을때는 데이터가 정상적으로 확인이 되는데,

솔루션으로 배치작업을 실행하면 테이블을 찾지 못하는 에러가 발생하였다.

 

 

그래서 처음에는 Metastore Client가 Server에 접근하지 못하여 Object를 가져오지 못하는 문제라고 생각하여 Hive의 Configuration중 HMS 관련한 해당 옵션을 수정했었다.

# hive-site.xml 수정

hive.metastore.server.filter.enabled=false

 

해당 옵션은 사용자가 누구인지를 판단하여 metastore server-side에서 메타정보를 읽을수 있게 할것인가, 아닌가를 셋팅해주는 옵션으로서 누구든지 메타스토어에 접근이 가능하도록 하게 false로 변경하였었다.

 

그러자 더이상 에러는 나지 않는데 테이블은 실제로 존재하지 않았으며, 이 역시 spark shell로 실행하면 정상적으로 수행 되었기에 옵션을 원상복구하였다.

 

그래서 Livy 문제라고 생각하여 Livy 로그를 살펴보던중, 다음과 같은 내용을 발견할수 있었다.

org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:11 INFO metastore.HiveMetaStoreClient: HMS client filtering is enabled.
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:11 INFO metastore.HiveMetaStoreClient: Trying to connect to metastore with URL thrift://hadoop01.com:9083
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:12 INFO metastore.HiveMetaStoreClient: HMSC::open(): Could not find delegation token. Creating KERBEROS-based thrift connection.
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:12 INFO metastore.HiveMetaStoreClient: Opened a connection to metastore, current connections: 1
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:12 INFO metastore.HiveMetaStoreClient: Connected to metastore
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:12 INFO metastore.RetryingMetaStoreClient: RetryingMetaStoreClient proxy=class org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient ugi=livy/hadoop01.com@BDAD.COM retries=1 delay=1 lifetime=0
org.apache.livy.utils.LineBufferedStream: 21/10/20 17:35:12 INFO metastore.HiveMetaStoreClient: Closed a connection to metastore, current connections: 0
...

 

Livy가 Hive metastore에 접근하자마자 1초만에 연결을 재시도하더니 끊어버린것이였다. 그래서 HMS 로그를 보았지만 에러는 찾아볼 수 없었다. 하지만 Metastore에 접근하지 못하는 것으로 보여 권한에 문제가 있다고 생각이 들었다.

 

그래서 Ranger내의 Hive Policy (Tables, Columns)를 확인 해본 결과, spark는 해당 테이블에 접근 권한이 있었으나 Livy는 해당 테이블에 접근 권한이 없었다. 그래서 Livy 계정에 read 권한을 부여하고 배치작업을 다시 수행해본 결과, 정상적으로 동작하는 것을 확인 할 수 있었다.

 

Livy가 apache incubating 프로젝트이다보니, 구글링을 해봐도 많은 내용이 나오지 않는데다가 Permission denied(!!!)가 발생하지 않아서 해결하는데 어려움이 있었으나 이것으로 Livy가 rest api로 spark 작업을 수행할때는 먼저 HMS에 접근하여 메타정보를 불러와 spark에게 전달해준다는 것을 알 수 있었다.

 

혹시나 Livy를 활용한다면 참고가 되었으면 좋겠다.