NiFi를 사용하면서 UninheritableFlowException 에러를 해결했던 방법을 공유하겠습니다. 참고로 제가 테스트 했던 NiFi는 File 기반의 유저 인증 방식을 사용했다는 점 참고 바랍니다.( FileUserGroupProvider )
문제 상황 & 분석 과정
해당 에러는 NiFi 노드 증설 시 발생했던 에러입니다. 신규 노드에 대해서 서버 작업을 모두 완료한 뒤 NiFi 설치를 완료했습니다. 그리고 이후에 NiFi 관련 설정 파일을 수정했습니다.
- File | authorizers.xml |
- 수정한 내용 | <userGroupProvider>, <accessPolicyProvide> 항목에 신규 노드 정보 추가 |
- 관련 참고 링크 |
https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#multi-tenant-authorization |
authorizers.xml |
<authorziers> <userGroupProvider> <identifier>file-user-group-provider</identifier> <class>org.apache.nifi.authorization.FileUserGroupProvider</class> <property name="Users File">/var/lib/nifi/conf/users.xml</property> <property name="Legacy Authorized Users File"> </property> <property name="Initial User Identity 0">admin</property> <property name="Initial User Identity 1">CN=NiFi_Server1_FQDN</property> <property name="Initial User Identity 2">CN=NiFi_Server2_FQDN</property> <property name="Initial User Identity 3">CN=NiFi_Server3_FQDN</property> <property name="Initial User Identity 4">CN=NiFi_Server4_FQDN</property> <property name="Initial User Identity 5">CN=NiFi_Server5_FQDN</property> <property name="Initial User Identity 6">CN=NiFi_Server6_FQDN</property> </userGroupProvider> <accessPolicyProvider> <identifier>file-access-policy-provider</identifier> <class>org.apache.nifi.authorization.FileAccessPolicyProvider</class> <property name="User Group Provider">file-user-group-provider</property> <property name="Authorizations File">/var/lib/nifi/conf/authorizations.xml</property> <property name="Initial Admin Identity">admin</property> <property name="Legacy Authorized Users File"></property> <property name="Initial User Identity 1">CN=NiFi_Server1_FQDN</property> <property name="Initial User Identity 2">CN=NiFi_Server2_FQDN</property> <property name="Initial User Identity 3">CN=NiFi_Server3_FQDN</property> <property name="Initial User Identity 4">CN=NiFi_Server4_FQDN</property> <property name="Initial User Identity 5">CN=NiFi_Server5_FQDN</property> <property name="Initial User Identity 6">CN=NiFi_Server6_FQDN</property> </accessPolicyProvider> <authorizer> <identifier>file-provider</identifier> <class>org.apache.nifi.authorization.StandardManagedAuthorizer</class> <property name="Access Policy Provider">file-access-policy-provider</property> </authorizer> </authorizers> |
하지만 신규 노드 정보를 위 파일에 입력했음에도 불구하고 NiFi는 신규 노드를 인식하지 못했습니다. ( NiFi webserver에는 접속 가능하지만 이후 과정 이용 불가 )
- NiFi web UI 에러 | Untrusted proxy CN={ Node name } |
- nifi-app.log |
org.apache.nifi.controller.UninheritableFlowException: Failed to connect node to cluster because local flow is different than cluster flow. .... Caused by: org.apache.nifi.controller.UninheritableFlowException: Proposed Authorizer is not inheritable by the flow controller because of Authorizer differences: Proposed Authorizations do not match current Authorizations: Proposed fingerprint is not inheritable because the current access policies is not empty. .... |
분석 및 해결 과정
nifi-app.log에 적혀있는 UninheritableFlowException에 대해 찾아봤습니다. 해당 에러는 NiFi의 모든 노드가 동일한 "flow.xml.gz" 파일을 가지고 있지 않을 때 발생하는 에러였습니다. "flow.xml.gz" 파일은 NiFi Web UI에서 여러 Processor를 생성한 Canvas의 정보를 담고 있습니다. NiFi의 모든 노드는 동일한 Web UI를 제공하기 때문에 "flow.xml.gz" 파일이 한 노드에서라도 다르다면 에러가 발생합니다. 그래서 기존 노드에 존재하던 "flow.xml.gz" 파일을 신규 노드에 모두 배포를 해줬습니다.
- File | flow.xml.gz |
- 경로 | /var/lib/nifi/conf |
- 작업 |
기존 노드의 파일을 신규 노드에 모두 배포 |
그리고 위의 NiFi Web에서 발생하는 에러를 봤을 때 "authorizers.xml" 파일에 기입한 신규 노드 정보가 제대로 반영되지 않았을 거라고 생각했습니다. 그래서 NiFi가 노드 정보들을 어떻게 인식하는지 알아봤습니다. NiFi 노드의 정보들이 담겨있는 파일들을 찾을 수 있었습니다. 해당 파일들은 "flog.xml.gz"와 같은 경로에 존재하던 파일들로 "users.xml", "authorizations.xml" 두 파일들이었습니다. 두 파일을 확인하니 기존 노드들의 정보들만 존재했고, 신규 노드를 추가하려고 했지만, 노드마다 상당히 긴 키 값이 존재했습니다. 그래서 두 파일 모두 사용자가 직접 생성해주는 것이 아닌 NiFi가 "authorizers.xml"의 내용을 토대로 자동으로 생성해준다는 것을 알 수 있었습니다. 자동으로 생성될 파일들이니 사전에 백업을 해두고 삭제를 했습니다. 결과적으로 NiFi를 실행했을 때 두 파일은 모두 새롭게 생성되었고, 신규 노드의 정보들도 모두 기입이 되어있었습니다.
authorizers.xml |
...... <userGroupProvider> ...... <property name="Users File">/var/lib/nifi/conf/users.xml</property> ...... </userGroupProvider> <accessPolicyProvider> ...... <property name="Authorizations File">/var/lib/nifi/conf/authorizations.xml</property> ...... </accessPolicyProvider> ...... |
- File | users.xml, authorizations.xml |
- 경로 | /var/lib/nifi/conf |
- 작업 |
백업 후 삭제하고, NiFi 재실행 |
문제들을 위의 방법대로 적용하니 NiFi는 정상적으로 기동이 되었고, 모든 서비스를 다시 사용할 수 있었습니다. 하지만 주의해야할 점으로는, "authorizations.xml" 파일을 지우고 재생성 시키기 때문에 기존에 명시해놨던 policy는 모두 초기화가 됩니다. 클러스터로써 분산 환경에서 NiFi를 이용하려면 필요한 policy들을 모두 재등록 해야한다는 점 꼭 주의하시기 바랍니다.
'Hadoop Ecosystem > NiFi' 카테고리의 다른 글
[NiFi] Json 데이터의 동적 크기 Array 전처리하기 (Base64 decoding) (1) | 2022.09.21 |
---|---|
[NiFi] Docker & NiFi 클러스터 환경에서 HDFS 데이터 분산 수집하기 (0) | 2022.02.12 |
[NiFi] Docker로 NiFi 클러스터 구성하기 (0) | 2022.01.31 |
[NiFi] Docker & NiFi로 HDFS 데이터 수집하기 (0) | 2021.11.17 |
[NiFi] NiFi의 핵심 개념 및 아키텍쳐 (0) | 2021.11.17 |