본문 바로가기

전체 글

(217)
[Spark] spark event log 로 데이터 사용량 추출 (event log 구조 분석) 데이터 라이프 사이클 관리를 위해 실제 데이터가 사용이 되는 지를 추적하고자 spark history server 에서 /applications/[app-id]/sql 방식으로 정리된 데이터를 바탕으로 실제 데이터 사용 여부를 추적하고 있었다.emr on eks를 적용한 이후로 spark history server 도 일회성으로 사라지고 있어서 자체 spark history server를 띄워서 사용하고 있었는데, 이렇게 사용할 경우 위의 api를 사용하면 event log가 클 경우에 서버에 과부하가 가게 되면서 추출에 어려움이 생겼다.그래서 해결 방안으로 적재된 event log에서 직접 데이터를 추출해보는 것을 목표로 하였다. 실제 사용된 이벤트에 대해 정리event log 구조는 여러 json 형..
[go/gin] log에 request, response 출력하기 1. 로그 형식을 json 형태로 출력 (https://stackoverflow.com/a/73936927)func jsonLoggerMiddleware() gin.HandlerFunc { return gin.LoggerWithFormatter( func(params gin.LogFormatterParams) string { log := make(map[string]interface{}) log["status_code"] = params.StatusCode log["path"] = params.Path log["method"] = params.Method log["start_time"] =..
[log4j2] log4j2 설정법 및 spark operator 연동 (feat. datahub 로깅) 데이터허브를 spark에 연동하면 데이터허브 로그가 추가로 발생하게 되는데 이 로그의 양이 spark로그 보다 많게 느껴지는 경우가 많다.로깅 레벨에 대해서 데이터허브를 찾아보면 log4j.properties 파일에 log4j.logger.datahub.spark=DEBUGlog4j.logger.datahub.client.rest=DEBUG 를 추가해서 디버깅하는 법이 나와있다. 근데 현재 사용하는 스파크 버전에서는 log4j 가 아니고 log4j2를 사용하고 있어서 뭔가 애매한 상황이었다. 여러가지 시도를 하다가 위 구문을 log4j2 형식에 맞게 변형하면 사용이 가능하고, 그 외에도 원하는 패키지의 로그 레벨을 자유롭게 지정이 가능하다는 걸 알게 됐다. * log4j2.properties 생성    ..
[Spark] spark history server 띄울 때, iam 권한으로 s3 읽기 emr on eks를 적용하면 spark history server를 사용하고 싶은데, ec2의 주소로 접근이 어려워서 직접 띄우기로 하였다. event log 설정과 docker를 활용한 띄우기는 아래 글들을 참고하여서 로컬에서 테스트는 잘 진행했다. https://aws.github.io/aws-emr-containers-best-practices/troubleshooting/docs/self-hosted-shs/ Self Hosted SHS - EMR Containers Best Practices GuidesSelf Hosted Spark History Server In this section, you will learn how to self host Spark History Server inste..
[실수노트] aws에서 여러 eks cluster에서 karpenter 운영 시 실수 1. 최초 설정 시, vpc의 region 별로 subnet을 지정하여 사용하도록 되어 있다. 이걸 subnet에 tag를 지정해서 사용하게 된다. 나중에 생성한 karpenter에서 같은 subnet을 사용할 경우 같은 tag key를 수정하게 돼서 기존의 karpenter가 정상적으로 작동하지 않게 된다. provisioner crd에서 subnet 지정 시, 기존 것과 동일하게 하여 처리하자. 2. karpenter에서는 신규 pod의 pending 상태를 인식해서 신규 instance를 생성까진 했는데, eks에선 해당 instance가 생성된 걸 인식하지 못 하는 현상이 발생했다. 여러가지 확인을 해보니, ec2의 security group이 이전에 생성했던 eks cluster의 securit..
knative/istio activator 종료 및 재실행 현상 kserve를 설치하면서 내부적으로 knative를 활용하고 있다. 언젠가부터 트래픽이 증가할 때 pod은 문제가 없는데 에러가 발생하기 시작했다. 호출하는 쪽에서 로그를 확인하니 upstream connect error or disconnect/reset before headers. reset reason: connection failure, transport failure reason: delayed connect error: 111 와 같은 에러가 발생했다. 확인하다 보니 knative 설치 때 생성된 activator가 죽었다 살아나기 시작했다. activator 자체는 proxy 역할로 request들을 모았다가 pod에 전달해주는 역할을 한다고 한다. 일단 proxy 리소스를 증가시켜보았다. ..
[Spark/Scala] NullPointerException 발생 - Some(null) 문제 spark로 json 형식 데이터에서 특정 key의 value를 추출한 뒤, 해당 값 중 정규표현식으로 추출하는 로직이 있었다. (자체 제작 함수들) extractJson(data, "key") match { case Some(a) => extraceRegex(a) match { case Some(b) => b case None => None } case None => None } 대충 이런 형태인데, 여기서 평소에 발생하지 않던 NullPointerException이 발생했다. Option 형태로 처리를 하고 있는데, null이 발생한다는 게 이해가 되지 않았다. 원본 데이터를 까보니 {"key": null} 평소에 없던 이런 형태의 데이터가 들어오고 있었다. 그런데 그렇다 하더라도 null은 None..
[실수노트] spark sql 에서 concat 함수 null 처리 spark sql을 사용하다 concat을 활용해서 임의의 값을 만드는 경우가 있었는데, null 이 발생하는 케이스가 발생했다. 일반 텍스트를 조합해서 사용하고 있었는데, null이 발생하는 게 이해가 안 됐었는데, 알고 보니 인자 중에 null이 있으면 null로 반환한다고 한다.