코알못

Ranger 적용된 EMR 집계 로그 S3 저장 안되는 이유 본문

ETC

Ranger 적용된 EMR 집계 로그 S3 저장 안되는 이유

코린이s 2023. 5. 16. 14:46
728x90

Yarn 집계 로그가 하둡 용량(EC2 로컬)을 많이 차지하여 저장소를 S3로 변경 하고자 하였다.

아래와 같이 설정하며 (반드시 \/ 로 경로 구분, 로그 경로는 하위 단계가 여러개도 가능)

  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.log-aggregation-enable": "true",
      "yarn.log-aggregation.retain-seconds": "-1",
      "yarn.nodemanager.remote-app-log-dir":"s3:\/\/[버킷경로]\/[로그경로]"
    }
  },

 

Ranger가 적용된 EMR 에서는 아래 오류 로그가 발생하며 로그가 S3에 저장되지 않았다.

2023-05-16 05:06:57,978 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService (NM ContainerManager dispatcher): Application failed to init aggregation
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: AccessDeniedException{ message=Failed to retrieve credentials from secret agent for request: GetTemporaryCredentialsForResourcesRequest(userId=null, username=null, resourcePrivileges=[ResourcePrivileges{arn='[버킷경로]/[로그경로]', privilegeFilters=GetObject}]) cause.class=com.amazonaws.emr.secretagent.client.model.SecretAgentClientException}
        at org.apache.hadoop.yarn.logaggregation.filecontroller.LogAggregationFileController.createAppDir(LogAggregationFileController.java:446)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService.initAppAggregator(LogAggregationService.java:273)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService.initApp(LogAggregationService.java:223)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService.handle(LogAggregationService.java:366)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService.handle(LogAggregationService.java:69)
        at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:219)
        at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:133)
        at java.lang.Thread.run(Thread.java:750)
Caused by: AccessDeniedException{ message=Failed to retrieve credentials from secret agent for request: GetTemporaryCredentialsForResourcesRequest(userId=null, username=null, resourcePrivileges=[ResourcePrivileges{arn='[버킷경로]/[로그경로]', privilegeFilters=GetObject}]) cause.class=com.

원인을 보니 아래와 같았다.

1. core,task spot 노드 Ranger host 설정이 안되어 있음

- 원인 : 저자의 Ranger 서버의 경우 도메인 등록을 하지 않아 호스트 설정이 필요했으나 EMR 단계를 이용하여 호스트 설정을 진행하여 master 노드에만 해당 설정이 적용 되었다.

- 해결 : 단계가 아닌 부트스트랩으로 호스트 설정 스크립트가 실행 되어야 task, core, spot 노드 모두 적용된다.

# host_setting.sh 

echo "172.X.X.X ranger.co.kr" >> /etc/hosts

람다 부트스트랩 설정 등록

...
BootstrapActions=[ 
      { 
        "Name": "host_setting.sh",
        "ScriptBootstrapAction": {
        "Path": "s3://[버킷,경로]/host_setting.sh"
        }
      }
     ],
...


2. Ranger에 s3 관련 정책 두가지 설정 되어 있지 않았음
- EMR 시스템 로그 저장 경로 yarn 유저에 대한 권한 없음
- EMR yarn 집계 로그 저장 경로 yarn 유저에 대한 권한이 없음

아래와 같이 레인저 설정을 진행하였다.

꼭 S3 경로 1개당 하나의 정책을 생성하도록 한다.(여러개 입력시 정책 적용이 안되어 동일한 오류 안되는 부분 확인..ㅎ)

수정한 설정이 반영 되었으며


설정뒤에 정상적인 로그 확인되며
2023-05-16 05:22:24,778 INFO com.amazon.ws.emr.hadoop.fs.s3n.MultipartUploadOutputStream (LogAggregationService #3): close closed:false s3://[버킷]/[집계로그저장경로]/application_1684206904867_0005/ip-172-x.x.xx.ap-northeast-2.compute.internal_8041

 집계 로그가 정상적으로 S3에 적재 되었다. (-1 로 설정하여 거의 실시간으로 저장)

 

728x90
Comments